SQL Server存储过程if语句注入字符串

SQL Server存储过程if语句注入字符串,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,使用SQLServer,我试图基于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.

使用SQLServer,我试图基于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 somethingTrue
@whereCondition = '1 = 1 '
else 
@whereCondition = branch = @branch

select * from table 
where @whereCondition AND etc...
用于if语句中的注入,请与Jodrell一起使用
但如果你需要一个动态的顶部,然后去什么是Kaf的建议

谢谢你们俩的帮助

不能像那样将语句部分作为变量注入,但是可以更改参数的大多数值

让存储过程根据参数执行可能需要不同查询计划的操作是一个坏主意,此SP的结果可能会因
@topRecords
参数的值而大不相同。您需要使用
RECOMPILE
选项来警告查询引擎,从而大大降低了SPs的好处。您是否考虑过只使用两个存储过程

如果您想动态地执行它,您可以动态地构建整个语句,生成一个大字符串,然后执行它

您应该使用
sp_executesql
执行
字符串
/
VarChar
。然后,类似的查询将从查询计划重用中受益

和以往一样,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

如果您想根据@topRecords来决定top记录的数量,您可以使用
INT
BIGINT
来决定所需记录的数量

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的回答使用动态查询。

+1
Top 0
将不起作用。返回零行。可以传递的最大可能值是bigint
9223372036854775807
。也可以使用
选项(重新编译)
使其考虑
TOP
的实际值,如果这会改变计划。@MartinSmith是的,0表示无记录。如果他不需要的话。它确实有效,但是,在我的SQL2005测试中。文字值提供了比变量更高的性能。您所说的是正确的,但如果我需要注入更多字符串,则不会起作用,它确实解决了我的动态top问题,但不能同时解决我的字符串注入问题,我需要在where语句中插入以接受全部或特定condition@rtp你应该相应地编辑问题,然后编辑我的答案变得更贴切。谢谢你的帮助,我很可能会同意你所说的,但问题是sql真的很大,所以现在我需要结束无数的单引号。。。zzz@rtp我不能否认这是一种痛苦。我尝试在客户端执行动态SQL,如果您使用的是.Net,它基本上是免费的。@Jodrell+1用于读心术和回答原始帖子中未出现的问题。