0

私は答えを見つけることなく、高低を検索しました。だから私はあなたたちn女の子が私の途中で私を助けることができることを願っています:

「SET@new_comment ...」で使用すると@old_commentがNULLになる理由がわかりませんが、出力パラメータ「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
4

3 に答える 3

0

パラメータに値を明示的に渡さなかったと思い@commentますか? もしそうなら、問題はここにあります:

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

パラメータ@commentのデフォルト値は でNULL、何かを連結すると がNULL得られNULLます。それは理由を説明し、@old_commentすべてに値がありますが、すべてをまとめると. これは、より適切なデフォルト値になります。@user@date@new_commentNULL

@comment NVARCHAR(1000) = '',

そして、書かれたコードは少し面倒ですが、デバッグ目的のみである@old_commentと思いますか? 直接@commentOldOUT使わない理由がわかりません。@old_comm

最後に、動的 SQL を使用している場合は、デバッグ パラメータを追加して SQL 文字列を簡単に出力することを強くお勧めします。これは、特に SSMS を利用できない場合に、非常に便利なトラブルシューティング ツールです。

于 2012-12-19T15:23:22.893 に答える
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

たとえば、私はパラメーターバインディングを正しく使用していませんでした。その後、テーブル名をパラメーターとしてバインドしようとしました...

于 2012-12-20T10:30:36.243 に答える
0

申し訳ありませんが、私はあなたのクエリを試しましたが、私にとってはうまくいきます! クエリを「デバッグ」しようとしましたか? デバッグ中は、すべての変数の値を確認できます。(SQL Server 2008 の緑色の矢印)

于 2012-12-18T15:42:35.010 に答える