【发布时间】:2017-01-18 17:33:02
【问题描述】:
我正在使用下面的存储过程。对于名为LockedByName 和LockedByLoginName 的参数,我想传递一个字符串(可以包含空格等 - 所以我用单引号括起来)或一个 NULL 值。
该过程适用于字符串,但不适用于空值。我认为这是因为它以某种方式静默失败,因为它不能将 NULL 值放入引号中。
有什么方法可以既保留引号又保留使用空值的能力?
当参数是一个空字符串也可以使用时,它同样会失败。
ALTER PROCEDURE [dbo].[ChangeLockFormStatus]
@FormID as int,
@LockedByName as nvarchar(50) = null,
@LockedByLoginName as nvarchar(50) = null,
@TableName as varchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ActualTableName AS varchar(255)
SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @TableName
DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = 'UPDATE ' + @ActualTableName
+ ' SET LockedByName=''' + @LockedByName + ''','
+ 'LockedByLoginName=''' + @LockedByLoginName
+ ''' WHERE [ID] = ' + CAST(@FormID AS VARCHAR(25)) + ';'
EXEC(@sql)
END
【问题讨论】:
-
您能否详细说明不适用于空值。代码是否失败并返回错误消息?还是您在表格中看到了意想不到的结果?
-
@destination-data 没有错误,但是数据库表中的值没有变化。
-
查看正在发生的事情的一个好方法是将
EXEC(@sql)替换为PRINT @sql。我怀疑问题是你不能连接空值。 Null +任何东西都会导致null。将 EXEC 与空变量结合不会导致更新或错误。 @Damien_The_Unbeliever 的回答应该会为您解决这些问题。
标签: sql sql-server stored-procedures