我可以帮助我将这个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
答案 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中安全地执行它实际上非常棘手;有几种常见的方法:
就个人而言,这些天我很少使用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'。无论您使用哪种方法,都可以将该工作的结果放入临时表中并将其加入主表。