变量在动态SQL中具有意外的NULL值

时间:2012-12-18 14:15:26

标签: sql-server-2008 dynamic-sql

我搜索得很高,但没有找到答案。所以我希望你们这些女孩可以帮助我:

当我在“SET @new_comment ...”中使用它时,我无法弄清楚为什么@old_comment为NULL,但是当我在outputparameter“SET @commentOldOUT ...”中使用它时它会返回一个很好的值

    CREATE PROCEDURE [dbo].[SP_NY_KOMMENTAR]
    @tabel NVARCHAR(100),
    @id INT,
    @comment NVARCHAR(1000) = NULL,
    @commentOldOUT NVARCHAR(1000) = NULL OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @user NVARCHAR(30);
    DECLARE @date NVARCHAR(10);
    DECLARE @new_id VARCHAR(100);
    DECLARE @new_comment NVARCHAR(MAX);
    DECLARE @old_comment NVARCHAR(MAX);
    DECLARE @old_comm NVARCHAR(MAX);
    DECLARE @old NVARCHAR(MAX);
    DECLARE @q2 NVARCHAR(MAX);

    SET @new_id = (SELECT CAST(@id AS VARCHAR(100)));
    SET @user = (SELECT ORIGINAL_LOGIN());
    SET @date = (SELECT CONVERT(DATE,GETDATE()));
    SET @old = 'SELECT comment FROM '+ @tabel +' WHERE id = ' + @ny_id;

    EXEC sp_executesql 
        @query = @old, 
        @params = N'@old_comm NVARCHAR(MAX) OUTPUT', 
        @old_com =  @old_comm OUTPUT;

    SET @old_comment = (SELECT @old_comm);

    SET @commentOldOUT = @old_comment;                          

    SET @new_comment = COALESCE(@old_comment + CHAR(13),'') + '[' + @user + ' ' + @date + '] ' + @comment;

    SET @q2 = N'UPDATE ' + @tabel + ' SET comment = ''' + @new_comment + ''' WHERE id = ' + @ny_id;
    EXEC (@q2);
END

3 个答案:

答案 0 :(得分:0)

对不起,我试过你的查询,但对我来说它运行正常!您是否尝试“调试”查询?在调试时,您可以看到每个变量的值。 (SQL Server 2008中的绿色箭头)

答案 1 :(得分:0)

我猜你没有为@comment参数明确传递一个值?如果是这样,问题就在这里:

SET @new_comment = COALESCE(@old_comment + CHAR(13),'') + '[' + @user + ' ' + @date + '] ' + @comment;

参数@comment的默认值为NULL,与NULL连接的任何内容都会导致NULL。这可以解释为什么@old_comment@user@date都有值,但是当它将它们放在一起时,@new_comment就是NULL。这将是一个更好的默认值:

@comment NVARCHAR(1000) = '',

你编写的代码有点乱,我假设@old_comment@commentOldOUT仅用于调试目的?我不明白为什么你不直接使用@old_comm

最后,如果您正在使用动态SQL,那么我强烈建议您添加a debugging parameter以轻松打印出您的SQL字符串。这是一个非常有用的故障排除工具,特别是如果您没有SSMS可用。

答案 2 :(得分:0)

我现在可以看到我做了几件事,下面是新的,现在正在运行的存储过程:

    CREATE PROCEDURE [dbo].[SP_NY_KOMMENTAR]
    @tabel NVARCHAR(100),
    @id INT,
    @comment NVARCHAR(1000) = NULL
AS
IF @comment IS NOT NULL 
    BEGIN
        SET NOCOUNT ON;
        DECLARE @user NVARCHAR(30);
        DECLARE @date NVARCHAR(10);
        DECLARE @SQLSelect nvarchar(500);
        DECLARE @ParmSelect nvarchar(500);
        DECLARE @old_comment NVARCHAR(MAX);
        DECLARE @old_commentOUT NVARCHAR(MAX);
        DECLARE @new_comment NVARCHAR(MAX);
        DECLARE @SQLUpdate nvarchar(500);
        DECLARE @ParmUpdate nvarchar(500);

        SET @user = (SELECT ORIGINAL_LOGIN());
        SET @date = (SELECT CONVERT(DATE,GETDATE()));
        SET @SQLSelect = N'SELECT @old_commentOUT = kommentar FROM ' + QUOTENAME(@tabel) + ' WHERE id = @id';
        SET @ParmSelect = N'@id INT, @old_commentOUT NVARCHAR(MAX) OUTPUT';

        EXEC sp_executesql 
            @SQLSelect,
            @ParmSelect,
            @id = @id,
            @old_commentOUT = @old_comment OUTPUT;

        SET @old_comment = (SELECT @old_comment);
        SET @new_comment = COALESCE(@old_comment + CHAR(13) + CHAR(10),'') + '[' + @user + ' ' + @date + '] ' + @comment;

        SET @SQLUpdate = N'UPDATE ' + QUOTENAME(@tabel) + ' SET kommentar = @new_comment WHERE id = @id';
        SET @ParmUpdate = N'@id INT, @new_comment NVARCHAR(MAX)';
        EXEC sp_executesql 
            @SQLUpdate, 
            @ParmUpdate,
            @id = @id,
            @new_comment = @new_comment;
    END

例如我没有使用参数绑定正确,之后我尝试将tabelnames绑定为参数......