我有一些动态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
答案 0 :(得分:3)
您不能将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参考: