2

SQL Serverを使用して、ifステートメントに基づいてSQLステートメントに文字列を挿入しようとしています。これは、ストアドプロシージャ内で実行しようとしていることに注意してください。

現在、このコードでエラーが発生しています。

Declare @topString varchar(240)

IF @topRecords > 0
SET @topString = 'top 500'
ELSE
SET @topString = ''

SELECT @topString * FROM( //incorrect syntax near FROM

SELECT  top 500 c.Id as [Customer Id],....
    UNION
    SELECT  top 500 c.Id as [Customer Id],....
)as table1 
Order by 1 desc

編集

if somethingTrue
@whereCondition = '1 = 1 '
else 
@whereCondition = branch = @branch

select * from table 
where @whereCondition AND etc...

正しい

ifステートメント内のインジェクションにはJodrellを使用し
ますが、動的なトップが必要な場合は、Kafによって提案されたものを使用します。
助けてくれてありがとう!

4

2 に答える 2

4

必要に応じて、またはを使用して、必要なレコード数に応じてdecide number of top records depending on @topRecords実行できます。INTBIGINT

DECLARE @top INT --This is declared as an int here

IF @topRecords > 0
  SET @top = 500
ELSE
  SET @top = 5000000 --Make it more than records if you need all 
                              --or make it 0 if no records needed.
                              --@top has to be >=0

--How to use it
SELECT TOP (@top) * FROM YourTable

編集:あなたの質問は最初はトップインジェクションしかありませんでした。ただし、(最近の質問の編集に従って)より多くのインジェクションが必要な場合は、次のように動的クエリを使用することをお勧めします@Jordell's answer.

于 2012-12-07T09:50:01.070 に答える
3

このような変数としてステートメント部分を挿入することはできませんが、パラメーターのほとんどの値を変更することはできます。

ストアドプロシージャに、パラメータに基づいて異なるクエリプランを必要とする可能性のある操作を実行させることはお勧めできません。このSPの結果は、パラメータの値に基づいて大きく異なる可能性があり@topRecordsます。RECOMPILEこのオプションを使用してクエリエンジンに警告し、SPの利点の多くを軽減する必要があります。ストアドプロシージャを2つだけ持つことを検討しましたか?

動的に実行する場合は、ステートメント全体を動的に作成し、1つの大きな文字列を作成して、それを実行できます。

/sp_executesqlを実行するためにを使用して調査する必要があります。次に、同様のクエリがクエリプランの再利用の恩恵を受けます。stringVarChar

相変わらずSommarskogは良いリファレンスです。


このようなもの

DECLARE @topString varchar(240);
DECLARE @statement varchar(max);

IF @topRecords > 0
    SET @topString = 'TOP 500';
ELSE
    SET @topString = '';

SET @statement = 'SELECT ' + @topString + ' * FROM
    (
        SELECT TOP 500 c.Id as [Customer Id], ....
        UNION
        SELECT TOP 500 c.Id as [Customer Id], ....
    ) table1 
    ORDER BY 1 DESC'

/* Then execute @statement */
EXEC sp_executesql @statement
于 2012-12-07T09:44:19.213 に答える