2024年1月19日 星期五

[研究]TSQL, 把 table1 中欄位名稱包含 Memo 的,欄位值都設定為 N''

[研究]TSQL, 把 table1 中欄位名稱包含 Memo 的,欄位值都設定為 N''

2024-01-19

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

TSQL, 把 table1 中欄位名稱包含 Memo 的,欄位值都設定為 N''

ChatGPT

在T-SQL中,你可以使用以下的UPDATE語句來將表(table)中包含特定字串的欄位值設定為N''(空字串)。這裡我們使用INFORMATION_SCHEMA.COLUMNS系統視圖來獲取表的列資訊,然後應用條件篩選。

假設你的表名稱是table1,以下是一個範例:

DECLARE @ColumnName NVARCHAR(MAX)
DECLARE @TableName NVARCHAR(MAX)
DECLARE @UpdateQuery NVARCHAR(MAX)

-- 設定表名稱
SET @TableName = 'table1'

-- 創建要更新的查詢
SET @UpdateQuery = ''

-- 獲取包含 Memo 的欄位名稱
SELECT @ColumnName = COALESCE(@ColumnName + ', ', '') + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName AND COLUMN_NAME LIKE '%Memo%'

-- 如果找到符合條件的欄位,則創建更新查詢
IF @ColumnName IS NOT NULL
BEGIN
    SET @UpdateQuery = 'UPDATE ' + @TableName + ' SET '

    -- 將每個欄位設定為 N'',注意這裡使用 QUOTENAME 避免SQL注入攻擊
    SET @UpdateQuery = @UpdateQuery + STUFF((SELECT ', ' + QUOTENAME(COLUMN_NAME) + ' = N'''''
                                             FROM INFORMATION_SCHEMA.COLUMNS
                                             WHERE TABLE_NAME = @TableName AND COLUMN_NAME LIKE '%Memo%'
                                             FOR XML PATH('')), 1, 2, '') + ';'
END

-- 如果有要更新的查詢,執行更新
IF @UpdateQuery <> ''
BEGIN
    EXEC sp_executesql @UpdateQuery
    PRINT '更新成功'
END
ELSE
    PRINT '找不到符合條件的欄位'



這個腳本會動態生成一個UPDATE語句,該語句將包含Memo的所有欄位的值都設定為N''。請注意,使用動態SQL語句有潛在的安全風險,請確保你的應用程序對表名稱進行了適當的輸入驗證,以防止SQL注入攻擊。


********************************************************************************

如果要顯示執行的 T-SQL

-- 如果有要更新的查詢,執行更新
IF @UpdateQuery <> ''
BEGIN
    EXEC sp_executesql @UpdateQuery
    PRINT '更新成功'
END
ELSE
    PRINT '找不到符合條件的欄位'

改成

-- 如果有要更新的查詢,執行更新
IF @UpdateQuery <> ''
BEGIN
--    EXEC sp_executesql @UpdateQuery
--    PRINT '更新成功'
      PRINT   @UpdateQuery
END
ELSE
    PRINT '找不到符合條件的欄位'


********************************************************************************

TSQL, 欄位數量不固定,把 table1 中欄位名稱包含 Memo 的,欄位值都設定為 N'',

把 table1 中欄位名稱包含 Check 的,欄位值都設定為 1,

把 table1 中欄位名稱 A1 ,欄位值都設定為 N'',

把 table1 中欄位名稱 A2 ,欄位值都設定為 N'',

把 table1 中欄位名稱 A3 ,欄位值都設定為 N'',

把 table1 中欄位名稱 A4 ,欄位值都設定為 null

ChatGPT

若欄位數量不固定,可以使用動態 SQL 來構建 UPDATE 語句。以下是一個 T-SQL 的範例,可以實現你的需求:

DECLARE @ColumnName NVARCHAR(MAX)
DECLARE @DynamicSQL NVARCHAR(MAX)

-- 創建一個游標,獲取所有包含 "Memo" 的列名
DECLARE memo_cursor CURSOR FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table1' AND COLUMN_NAME LIKE '%Memo%'

-- 動態構建 UPDATE 語句
SET @DynamicSQL = 'UPDATE table1 SET '

OPEN memo_cursor
FETCH NEXT FROM memo_cursor INTO @ColumnName

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 將每個包含 "Memo" 的列的值設定為 N''
    SET @DynamicSQL = @DynamicSQL + QUOTENAME(@ColumnName) + ' = N'''', '

    FETCH NEXT FROM memo_cursor INTO @ColumnName
END

CLOSE memo_cursor
DEALLOCATE memo_cursor

-- 創建一個游標,獲取所有包含 "Check" 的列名
DECLARE check_cursor CURSOR FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table1' AND COLUMN_NAME LIKE '%Check%'

OPEN check_cursor
FETCH NEXT FROM check_cursor INTO @ColumnName

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 將每個包含 "Check" 的列的值設定為 1
    SET @DynamicSQL = @DynamicSQL + QUOTENAME(@ColumnName) + ' = 1, '

    FETCH NEXT FROM check_cursor INTO @ColumnName
END

CLOSE check_cursor
DEALLOCATE check_cursor

-- 將 A1、A2、A3 列的值設定為 N'',A4 列的值設定為 null
SET @DynamicSQL = @DynamicSQL + 'A1 = N'''', A2 = N'''', A3 = N'''', A4 = NULL'

-- 執行動態 SQL
EXEC sp_executesql @DynamicSQL


********************************************************************************

(完)

相關

[研究]T-SQL 選擇 Table1 中包含 "Memo" 的欄位名稱以及相應的欄位內容
https://shaurong.blogspot.com/2024/01/t-sql-table1-memo.html

[研究]TSQL, 把 table1 中欄位名稱包含 Memo 的,欄位值都設定為 N'
'https://shaurong.blogspot.com/2024/01/tsql-table1-memo-n.html


沒有留言:

張貼留言