在 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参考:
我有一些动态 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参考: