Sql 动态更新问题
我有一个表,我们称之为“table_X”,在这个表中,我有多个列(46),将来我们可能会将其扩展为更多列,因为表的来源是一个旧的ERP系统,在某些情况下,我们需要转换数据集,其中一个转换是,当我们用空值替换“”值时,我遇到了问题,我写了一个动态更新,因为前面提到的原因(将来我们将有更多列),但我收到了错误消息,现在我被卡住了Sql 动态更新问题,sql,tsql,Sql,Tsql,我有一个表,我们称之为“table_X”,在这个表中,我有多个列(46),将来我们可能会将其扩展为更多列,因为表的来源是一个旧的ERP系统,在某些情况下,我们需要转换数据集,其中一个转换是,当我们用空值替换“”值时,我遇到了问题,我写了一个动态更新,因为前面提到的原因(将来我们将有更多列),但我收到了错误消息,现在我被卡住了 DECLARE @SQL_columnnull NVARCHAR(max) DECLARE @db2 NVARCHAR(max) DECLARE @table2 NV
DECLARE @SQL_columnnull NVARCHAR(max)
DECLARE @db2 NVARCHAR(max)
DECLARE @table2 NVARCHAR(max)
SET @db2 = 'db'
SET @table2 = 'table_X'
SELECT @SQL_columnnull_part_1 = STRING_AGG(CAST( N' UPDATE '+@db2+'.[dbo].'+@table2+' WITH (TABLOCK) SET ' AS NVARCHAR(MAX))
+QUOTENAME(COLUMN_NAME,'['']') + N' = NULL WHERE '
+QUOTENAME(COLUMN_NAME,'['']') ,+ N' = '''';')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table2
AND INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION <= 3
你在摆弄你的绳子 语法是
STRING_AGG ( expression, separator )
你的分离器是
+ N' = '''';'
由于在最后一个条目之后没有应用分隔符,因此您将得到您看到的结果
我也会对强制转换保持警惕,您将表达式的开头强制转换为nvarchar(max),但是您是串联的非varchar字符串
最后,为什么你要为每一个专栏做单独的更新?这是非常糟糕的表现
首先,执行所需操作的固定查询是:
SELECT
@SQL_columnnull =
STRING_AGG(
CAST(
' UPDATE ' + @db2 + '.[dbo].' + @table2 + ' WITH (TABLOCK) SET '
+ QUOTENAME(COLUMN_NAME, '['']') + N' = NULL WHERE '
+ QUOTENAME(COLUMN_NAME, '['']') +N' = '''''
AS NVARCHAR(MAX))
,';')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table2
AND INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION <= 3
旁注
QUOTENAME(列名,['']')
有点奇怪。QUOTENAME
的第二个参数是单个字符,因此它将被解析为QUOTENAME(列名“[”)
(由于默认值为[
),这也有点毫无意义)。感谢您的详细解释!
SELECT
@SQL_columnnull =
STRING_AGG(
CAST(
' UPDATE ' + @db2 + '.[dbo].' + @table2 + ' WITH (TABLOCK) SET '
+ QUOTENAME(COLUMN_NAME, '['']') + N' = NULL WHERE '
+ QUOTENAME(COLUMN_NAME, '['']') +N' = '''''
AS NVARCHAR(MAX))
,';')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table2
AND INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION <= 3
SELECT
@SQL_columnnull =
N' UPDATE ' + @db2 + '.[dbo].' + @table2 + ' WITH (TABLOCK) SET ' +
STRING_AGG(
CAST(
QUOTENAME(COLUMN_NAME, '['']') + N'='+N'IIF('+ QUOTENAME(COLUMN_NAME, '['']') + N'= '''',NULL,'+ QUOTENAME(COLUMN_NAME, '['']')+') '
AS NVARCHAR(MAX))
,',
')
+'
WHERE '+
STRING_AGG(
CAST(
QUOTENAME(COLUMN_NAME, '['']') + N'= '''' '
AS NVARCHAR(MAX))
,' OR ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table2
AND INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION <= 3
UPDATE db.[dbo].table_X
SET [Column_1] = IIF([Column_1] = '', NULL, [Column_1])
,[Column_2] = IIF([Column_2] = '', NULL, [Column_2])
,[Column_3] = IIF([Column_3] = '', NULL, [Column_3])
WHERE [Column_1] = ''
OR [Column_2] = ''
OR [Column_3] = ''