在 Dynamic SQL 中使用 COALESCE 删除 NULL

Removing NULL with COALESCE in Dynamic SQL

我有一些动态 SQL 作为我要执行的存储过程的一部分:

    SET @SQL_TXT = 'INSERT INTO ' +@ENTY_TABLE_NAME+
              '([ITEM_NAME]
               ,[ADD_DTT]
               ,[ADD_USR]
               ,[UPD_DTT]
               ,[UPD_USR]
               ,[ACTIVE_IND]
               ,[ITEM_PK])
         VALUES 
               ('''+@UPD_VALUE+'''
          , CURRENT_TIMESTAMP
          , '''+@UPD_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''+@UPD_USR_DOM_NAME+''',''Y'','''+@ITEM_PK+''');
          SET @Id = SCOPE_IDENTITY();
          RETURN;'

运行正常,但是 ITEM_NAME 不能为 NULL 所以我想添加一个 COALESE():

SET @SQL_TXT = 'INSERT INTO ' +@ENTY_TABLE_NAME+
          '(COALESCE([ITEM_NAME], '')
           ,[ADD_DTT]
           ,[ADD_USR]
           ,[UPD_DTT]
           ,[UPD_USR]
           ,[ACTIVE_IND]
           ,[ITEM_PK])
     VALUES 
           ('''+@UPD_VALUE+'''
      , CURRENT_TIMESTAMP
      , '''+@UPD_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''+@UPD_USR_DOM_NAME+''',''Y'','''+@ITEM_PK+''');
      SET @Id = SCOPE_IDENTITY();
      RETURN;'

但是我收到这个错误:

Incorrect syntax near the keyword 'COALESCE'.

Unclosed quotation mark after the character string ');

              SET @Id = SCOPE_IDENTITY();

              RETURN;'.

Incorrect syntax near '='.

我这辈子都不知道这个 ')' 在哪里。我做错了什么?

编辑:这里是 exec

EXECUTE SP_executesql @SQL_TXT, N'@Id INTEGER OUTPUT', @Id OUTPUT

您不能将 coalesce() 放在 insert 的列名目标周围,您可以在插入的值周围使用它。

  SET @SQL_TXT = 'INSERT INTO ' +@ENTY_TABLE_NAME+
              '([ITEM_NAME]
               ,[ADD_DTT]
               ,[ADD_USR]
               ,[UPD_DTT]
               ,[UPD_USR]
               ,[ACTIVE_IND]
               ,[ITEM_PK])
         VALUES 
               ('''+coalesce(@UPD_VALUE,'')+'''
          , CURRENT_TIMESTAMP
          , '''+@UPD_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''+@UPD_USR_DOM_NAME+''',''Y'','''+@ITEM_PK+''');
          SET @Id = SCOPE_IDENTITY();
          RETURN;'


注意:@UPD_USR_DOM_NAME 被插入到两个不同的列中。不确定这是否是故意的,只是想我会指出来。

您还可以完全参数化其余值以供 sp_executesql 使用,而不是像那样连接它们。 (在这个例子中猜测你的参数的数据类型)

declare @sql nvarchar(max);
declare @params nvarchar(max);
declare @id int;

set @sql = N'INSERT INTO ' +@ENTY_TABLE_NAME+'([ITEM_NAME] ,[ADD_DTT] ,[ADD_USR] ,[UPD_DTT] ,[UPD_USR] ,[ACTIVE_IND] ,[ITEM_PK])
      VALUES (coalesce(@UPD_VALUE,''), CURRENT_TIMESTAMP, @UPD_USR_DOM_NAME, CURRENT_TIMESTAMP,@UPD_USR_DOM_NAME,''Y'',@ITEM_PK);
      SET @Id = SCOPE_IDENTITY();
      RETURN;'

set @params = N'@UPD_VALUE varchar(32),@UPD_USR_DOM_NAME varchar(32), @ITEM_PK varchar(32), @Id INTEGER OUTPUT';

EXECUTE SP_executesql @sql, @params, @UPD_Value, @UPD_USER_DOM_NAME, @ITEM_PK, @Id = @Id OUTPUT;

动态sql参考: