我搜索得很高,但没有找到答案。所以我希望你们这些女孩可以帮助我:
当我在“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
答案 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绑定为参数......