我正在尝试将参数数组发送到存储过程
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但也无法使其正常工作。
任何帮助?
答案 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/