像数组一样传入数组T-SQL

时间:2012-02-23 22:55:19

标签: tsql

我可以帮助我将这个sql变成存储过程..

select * from voilets 
where cfrw = 'F16'
UNION 
(select * 
from voilets
where cfrw in ('B05','B12','R02','F01','F16','F17','U11','U03','U04','U21')) 
ORDER BY DSCA

其中'F16是一个名为@default的变量 和 'B05','B12','R02','F01','F16','F17','U11','U03','U04','U21'是一个@voilets数组

这对我不起作用:

@sCarrierSelect varchar(max)
AS
BEGIN

declare @SQL nvarchar(4000)

set @SQL = '

select * from voilets
where t_cfrw =  ' + @default + '
UNION 
(select * 
from carriers 
where t_cfrw in (' + @voilets+')) 
ORDER BY T_DSCA

'
print @SQL

exec sp_executesql @SQL


END

4 个答案:

答案 0 :(得分:3)

IF 您的SQL Server IS > = 2008然后:

USE tempdb;
GO

CREATE TABLE voilets
    (cfrw char(3), DSCA int)
go
INSERT INTO voilets VALUES ('R02', 2)
INSERT INTO voilets VALUES ('F16', 5)
INSERT INTO voilets VALUES ('F16', 4)
INSERT INTO voilets VALUES ('X77', 9)
go
CREATE TYPE myType AS TABLE (id CHAR(3));
GO
CREATE PROCEDURE usp_myProc
    @default char(3),
    @voiletsTVP myType READONLY
    AS 
select * from voilets 
where cfrw = @default
UNION 
(select * 
from voilets
where cfrw in (SELECT * FROM @voiletsTVP)) 
ORDER BY DSCA
GO
-------------------------
DECLARE @default char(3)
SET @default='F16'
DECLARE @voiletsTVP AS myType;
INSERT INTO @voiletsTVP SELECT * FROM (VALUES ('B05'),('B12'),('R02'),('F01'),('F16'),('F17'),('U11'),('U03'),('U04'),('U21')) q(x)
EXEC usp_myProc @default,@voiletsTVP
GO

结果集:

cfrw    DSCA
R02     2
F16     4
F16     5

答案 1 :(得分:1)

在sproc中安全地执行它实际上非常棘手;有几种常见的方法:

  • 使用udf在令牌上拆分字符串 - 谷歌为“拆分udf”(会有很多),并加入结果
  • 使用表值参数

就个人而言,这些天我很少使用sprocs;我会用dapper:

List<string> foo = ...
var items = conn.Query<SomeType>(
    "select * from [table] where colName in @foo", new { foo }).ToList();

大多数LINQ提供商和ORM也会在这里提供选项,包含Contains等。

答案 2 :(得分:1)

您可以了解Passing Arrays in SQL Parameters using XML Data Type in SQL Server 2005

见样本:

/* for this xml:
<list>
    <item>42</item>
    <item>73</item>
    <item>2007</item>
</list>
*/

CREATE FUNCTION [lm].[SplitList]
(
    @list AS XML
)
RETURNS TABLE
AS
RETURN
(
    SELECT tempTable.item.value('.', 'VARCHAR(MAX)') AS Item
    FROM @list.nodes('list/item') tempTable(item)
);

答案 3 :(得分:0)

为什么不使用sql CLR函数来拆分值,将它们传递给您的过程。这是一个非常好的快速拆分字符串实现:CLR Split String。如果你不能使用sql clr,那么在线查看'sql split string'。无论您使用哪种方法,都可以将该工作的结果放入临时表中并将其加入主表。