0
EXEC SP_EXECUTESQL 
            @DynamicSQL
        ,   N'@HostIDs VARCHAR(MAX) OUTPUT'
        ,   @HostIDs OUTPUT;

PRINT @HostIDs;

SELECT @HostIDs AS HostIDs;
SET @UpdateSQL = '
            EXECUTE [dbo].[usp_Win7_HostUpdater_NEW]
            @HostID = ''' + @HostIDs + ''' , 
            @PackageID = ''' + @PackageID  + ''' , 
            @MigrationFlag = ''' + @MigrationFlagID + ''' , 
            @Manufacturer = ' + @Manufacturer + ' , 
            @Product = ' + @Product + ' , 
            @Version = ' + @Version + ' ,
            @Reason = ' + @Reason + ' ,
            @Contact = ' + @Contact + '
        ';

        SELECT @UpdateSQL AS UpdateSQL;
        PRINT @UpdateSQL;           
        EXEC( @UpdateSQL )  
  END  

上記のコードが最後の部分である SQL Server 2005 と 2008 の両方にストアド プロシージャがあります。

VARCHAR(MAX)コンマで区切られた数値を返します。

現在、この戻り値は 600k 文字を超えています。これを SQL Server 2005 で実行すると、50% の確率で動作し、@HostIDs常にデータが入力@UpdateSQLされ、正しい値が生成されて実行されます。

SQL Server 2008 では、@HostIDs入力されますが、@UpdateSQL常に NULL です

これは私を途方もなく奇妙にしています

誰かが私の奇妙な問題に光を当てることができますか?

4

3 に答える 3

1

パラメータのいずれかがnullの場合、ステートメント全体がnullになります。このようなことで回避できます(データ型が何であるかはわかりませんが、連結を機能させるために、int / bool / etc。型からvarcharにキャストする必要がある場合があります):

SET @UpdateSQL = '
            EXECUTE [dbo].[usp_Win7_HostUpdater_NEW]
            @HostID = ' + ISNULL('''' + @HostIDs + '''', 'null') + ' , 
            @PackageID = ' + ISNULL('''' + @PackageID + '''', 'null')  + ' , 
            @MigrationFlag = ' + ISNULL('''' + @MigrationFlagID + '''', 'null') + ' , 
            @Manufacturer = ' + ISNULL(@Manufacturer, 'null') + ' , 
            @Product = ' + ISNULL(@Product, 'null') + ' , 
            @Version = ' + ISNULL(@Version, 'null') + ' ,
            @Reason = ' + ISNULL(@Reason, 'null') + ' ,
            @Contact = ' + ISNULL(@Contact, 'null') + '
        ';
于 2012-09-25T16:19:29.973 に答える
1

これらをチェックしてください

SET CONCAT_NULL_YIELDS_NULL OFF
select 'abc' + null + 'def'
--- abcdef

SET CONCAT_NULL_YIELDS_NULL ON
select 'abc' + null + 'def'
--- NULL

これは問題を回避する 1 つの方法です。文字列を構築する前にオフにし、後でオンに戻すことです。文字列連結のシーケンスに NULL があると、ステートメント全体が NULL になります。これit works like 50% of the timeは、すべての変数が非 NULL の場合です。

ただし、質問がより大きなパズルの抽象化でない限り、動的 SQL を作成して、表示されている特定のスニペットに対して直接実行が機能する場合にそれを実行する理由はありません。

于 2012-09-25T23:46:44.863 に答える
0

nullを処理していないために発生します

exec の代わりに sp_executesql を使用できます。これには、exec よりもいくつかの利点があります。

于 2012-09-25T23:05:04.413 に答える