Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 动态更新问题_Sql_Tsql - Fatal编程技术网

Sql 动态更新问题

Sql 动态更新问题,sql,tsql,Sql,Tsql,我有一个表,我们称之为“table_X”,在这个表中,我有多个列(46),将来我们可能会将其扩展为更多列,因为表的来源是一个旧的ERP系统,在某些情况下,我们需要转换数据集,其中一个转换是,当我们用空值替换“”值时,我遇到了问题,我写了一个动态更新,因为前面提到的原因(将来我们将有更多列),但我收到了错误消息,现在我被卡住了 DECLARE @SQL_columnnull NVARCHAR(max) DECLARE @db2 NVARCHAR(max) DECLARE @table2 NV

我有一个表,我们称之为“table_X”,在这个表中,我有多个列(46),将来我们可能会将其扩展为更多列,因为表的来源是一个旧的ERP系统,在某些情况下,我们需要转换数据集,其中一个转换是,当我们用空值替换“”值时,我遇到了问题,我写了一个动态更新,因为前面提到的原因(将来我们将有更多列),但我收到了错误消息,现在我被卡住了

 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] = ''