T-SQL:将一组id传递给存储过程

时间:2013-10-11 22:36:41

标签: sql-server sql-server-2008 tsql

我正在尝试将参数数组发送到存储过程

SELECT [id_Curso] AS IDCurso
  ,[Cod_Estabelecimento] AS CodEstabelecimento
  ,[Des_Estabelecimento] AS DesEstabelecimento
  ,[Cod_Curso] AS CodCurso
  ,[Des_Curso] AS DescCurso
  ,[Cod_Grau] AS CodGrau
  ,[Des_Grau] AS DescGrau
  ,[Cod_Area_Educacao] AS CodAreaEducacao
  FROM [BEP_DEV].[dbo].[Curso]
  where [Cod_Area_Educacao] in @List

DECLARE @List VARCHAR(MAX);
SELECT @List = '(1,2,3,4)';

SELECT [id_Curso] AS IDCurso
  ,[Cod_Estabelecimento] AS CodEstabelecimento
  ,[Des_Estabelecimento] AS DesEstabelecimento
  ,[Cod_Curso] AS CodCurso
  ,[Des_Curso] AS DescCurso
  ,[Cod_Grau] AS CodGrau
  ,[Des_Grau] AS DescGrau
  ,[Cod_Area_Educacao] AS CodAreaEducacao
  FROM [BEP_DEV].[dbo].[Curso]
where [Cod_Area_Educacao] in (1,2,3,4)

如何将第一个案例转换为第二个案例(哪个有效)?

我也尝试过使用xml但也无法使其正常工作。

任何帮助?

3 个答案:

答案 0 :(得分:11)

有很多种可能性,但鉴于您使用的是SQL 2008,最重要的选择是使用新的表值参数,您可以在其中将整个表发送到查询或存储过程中一个go(在你的情况下,一个表有一个列,任意数量的ID)。

首先在数据库中创建一个表类型:

CREATE TYPE idTable AS TABLE (id INT)

然后使用该类型的参数声明您的过程,并像任何其他表一样使用它:

CREATE PROCEDURE SelectList (@IDs idTable READONLY) AS
SELECT * FROM sometable
INNER JOIN @IDs AS idTable ON idTable.id=sometable.id

有一篇很棒的文章详细讨论了这个和其他方法来做你需要的事情http://www.sommarskog.se/arrays-in-sql.html

答案 1 :(得分:1)

您可以使用解析字符串的udf并将值插入到表中(在您的情况下包含一个int列),然后通过调用CSV字符串上的udf将表中的Curso表连接起来。

答案 2 :(得分:0)

我会把它传递给xml。它简单而且非常高效。这是一个很好的帖子,详细信息。 https://www.simple-talk.com/blogs/2012/01/05/using-xml-to-pass-lists-as-parameters-in-sql-server/