2013-10-05 33 views
2

我正在使用SQL Server 2008 R2。 我需要为下面的T-SQL的最后部分使用一个参数。将sp_executeSQL的参数值部分指定为参数

在这部分中,指定了sp_executesql的参数值,但我想动态提供它。

EXECUTE sp_executesql @sql,N'@startIndex1 int,@maxRows1 int', 
         @startIndex1 = @startIndex,@maxRows1 = @maxRows--LAST PART 
+0

你可以扩展一下,准确描述你想要做什么(或避免)吗?我试图将自己的头脑围绕在这里,你将不得不在这里嵌套动态SQL来实现你想要做的事情,而且还必须在某个地方对某些东西进行硬编码,这让我感到奇怪:***为什么?*** –

+0

我在网页中有网格,每个网页都有过滤器。如果没有指定过滤器,则最后一部分不会成为问题,因为始终传递startIndex和maxRows的值。但是,如果在供应商栏中有过滤器,那么我需要动态添加“供应商”参数。当多列被过滤时,则会有多个参数。我可以在C#代码中使用内联SQL来做到这一点,但我认为存储过程会更好。我的文章中提到的T-SQL代码是存储过程的一部分。 – Sunil

回答

10

根据你的进一步解释,我认为你是让这更复杂,比它必须是。你可以做到以下几点:

DECLARE @p1 INT = 5, @p2 INT = 3, @p3 INT = NULL; 

DECLARE @sql NVARCHAR(MAX) = N'SELECT cols FROM dbo.table WHERE @p1 = @p1'; 

SET @sql += CASE WHEN @p2 IS NOT NULL THEN N' AND @p2 = @p2' ELSE '' END; 

SET @sql += CASE WHEN @p3 IS NOT NULL THEN N' AND @p3 = @p3' ELSE '' END; 

EXEC sp_executesql @sql, N'@p1 INT, @p2 INT, @p3 INT', @p1, @p2, @p3; 

这将工作没有问题 - 这是不是在实际的语句中使用仅下降和忽略的参数。

+0

因此,您的方法是使用sp_executesql为网页网格中的每个可过滤列指定参数,但只在sql查询中包含所需的参数。优秀。这就说得通了。谢谢。我不知道可以指定sql查询中不存在的参数,但这里是TRICK。 – Sunil