【问题标题】:Specify the parameter values part of sp_executeSQL as a parameter将 sp_executeSQL 的参数值部分指定为参数
【发布时间】:2013-10-05 21:47:22
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否扩展一下并准确描述您正在尝试(或避免)做的事情?我想知道您将不得不在此处嵌套动态 SQL 多少次才能实现您想要做的事情,并且仍然必须在某处硬编码某些东西,这让我想知道: 为什么???
  • 我在一个网页中有一个网格,它的每一列都有过滤器。如果没有指定过滤器,那么最后一部分不是问题,因为 startIndex 和 maxRows 的值总是被传递。但是如果供应商列上有一个过滤器,那么我需要动态添加一个“供应商”参数。当过滤多个列时,就会有多个参数。我可以在 C# 代码中使用内联 SQL 来做到这一点,但我认为存储过程会更好。我帖子中提到的 T-SQL 代码是存储过程的一部分。

标签: sql-server-2008-r2 sp-executesql


【解决方案1】:

根据您的进一步解释,我认为您使这变得比必须的更复杂。您可以执行以下操作:

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;

这不会有任何问题 - 任何未在实际语句中使用的参数都将被删除和忽略。

【讨论】:

  • 所以您的方法是为网页网格中的每个可过滤列指定一个带有 sp_executesql 的参数,但只在 sql 查询中包含所需的参数。优秀的。这就说得通了。谢谢。我不知道可以指定sql查询中不存在的参数,但这就是TRICK。
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多