【问题标题】:Passing either null or a string to a stored procedure doesn't work (because of quotes?)将 null 或字符串传递给存储过程不起作用(因为引号?)
【发布时间】:2017-01-18 17:33:02
【问题描述】:

我正在使用下面的存储过程。对于名为LockedByNameLockedByLoginName 的参数,我想传递一个字符串(可以包含空格等 - 所以我用单引号括起来)或一个 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


【解决方案1】:

如果您使用sp_executesql,您可以继续直接使用您的参数,而不必将它们分解成字符串。比如:

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] = @FormID;'

    EXEC sp_executesql @sql,
         N'@LockedByName nvarchar(50),@LockedByLoginName nvarchar(50),@FormID int',
         @LockedByName,@LockedByLoginName,@FormID
END

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 2011-01-22
    • 2021-08-03
    • 1970-01-01
    • 2014-04-16
    • 2017-03-21
    • 1970-01-01
    • 2018-10-03
    • 2018-05-09
    相关资源
    最近更新 更多