-1

プログラムに問題があり、コードにエラーは見つかりませんでした。StopProcが原因だと思います。誰かが私のストアドプロシージャをチェックして、それが有効かどうかを確認できますか?

ALTER PROCEDURE dbo.Update_FeatureUsers 
    (
        @FeatureID int,
        @UserID nvarchar (MAX),
        @CreatedUserID int
    )

AS
    SET NOCOUNT ON

    Declare @ParmDefinition nvarchar (400)
    Declare @Query nvarchar(MAX)

    SET @Query = N''
    SET @Query = @Query + N'DELETE FeatureUsers '
    SET @Query = @Query + N'FROM FeatureUsers '
    SET @Query = @Query + N'WHERE FeatureUsers.FeatureID = @FeatureID '
    SET @Query = @Query + N'    AND FeatureUsers.UserID NOT IN ('+ @UserID +')'

    EXECUTE sp_executesql @Query

    SET @Query = N''
    SET @Query = @Query + N'INSERT INTO FeatureUsers (FeatureID, UserID, CreatedUserID) '
    SET @Query = @Query + N'SELECT @FeatureID, Usager.UserID, @CreatedUserID '
    SET @Query = @Query + N'FROM Usager WITH (NOLOCK) '
    SET @Query = @Query + N'WHERE Usager.UserID IN ('+ @UserID +') '
    SET @Query = @Query + N'    AND Usager.UserID NOT IN '
    SET @Query = @Query + N'    ( '
    SET @Query = @Query + N'        SELECT FeatureUsers.UserID '
    SET @Query = @Query + N'        FROM FeatureUsers WITH (NOLOCK) '
    SET @Query = @Query + N'        WHERE FeatureUsers.UserID IN ('+ @UserID +') '
    SET @Query = @Query + N'            AND FeatureUsers.FeatureID = @FeatureID '
    SET @Query = @Query + N'    ) '

    SET @ParmDefinition = N'@FeatureID int '
    EXECUTE sp_executesql @Query, @ParmDefinition, @FeatureID = @FeatureID

    SET NOCOUNT OFF

    RETURN
4

1 に答える 1

2

最初の動的SQLクエリもアクセスしたい@FeatureIDのですが、渡していないのです。

だから移動:

SET @ParmDefinition = N'@FeatureID int '

プロシージャの先頭まで呼び出してから

EXECUTE sp_executesql @Query,@ParmDefinition,@FeatureID = @FeatureID

動的SQLの両方の部分に対して。


一般的な戦略の場合-ストアドプロシージャにテーブル値のパラメータを受け入れさせて@Usersから、動的SQLをまったく使用する必要がない方がはるかに優れています。


実際、2回目の読み取りでは、2番目のクエリもを参照@CreatedUserIDするため、2番目のクエリにパラメータとして渡す必要があります。したがって、2つの間でパラメーター定義を変更するか、パラメーターに追加して最初のクエリに(無意味に)渡す必要があります。

于 2013-01-30T15:32:24.603 に答える