Tsql 传入类似数组的变量T-SQL

Tsql 传入类似数组的变量T-SQL,tsql,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’

我可以找个人帮我把这个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

在存储过程中安全地执行该操作实际上相当棘手;有几种常见的方法:

使用自定义项拆分令牌上的字符串-google对于拆分自定义项将有很多,并在结果上加入 使用表值参数 就我个人而言,我现在很少使用sprocs;我会用整洁的:

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

大多数LINQ提供程序和ORM在这里也有选项,包括包含等。

在存储过程中安全地执行该操作实际上相当棘手;有几种常见的方法:

使用自定义项拆分令牌上的字符串-google对于拆分自定义项将有很多,并在结果上加入 使用表值参数 就我个人而言,我现在很少使用sprocs;我会用整洁的:

List<string> foo = ...
var items = conn.Query<SomeType>(
    "select * from [table] where colName in @foo", new { foo }).ToList();
大多数LINQ提供程序和ORM在这里也会有选项,包括Contains等。

如果SQL Server大于等于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
如果SQL Server大于等于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

为什么不使用SQLCLR函数来分割您的值,并将它们传递到您的过程中呢。下面是一个非常好且快速的拆分字符串实现:。如果不能使用sql clr,请联机查找“sql拆分字符串”。无论使用哪种方法,都可以将该工作的结果放入临时表中,并将其连接到主表。

为什么不使用sql CLR函数拆分值,并将其传递到过程中呢。下面是一个非常好且快速的拆分字符串实现:。如果不能使用sql clr,请联机查找“sql拆分字符串”。无论使用哪一种,您都会将该工作的结果放入临时表中,并将其连接到主表。

您可以了解

见示例:

/* 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)
);
你可以了解

见示例:

/* 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)
);

@不幸的是,需求是使用存储过程。是否仍然可以使用存储的进程运行查询。我无法理解这一点:/@marc不幸的是,要求使用存储过程。是否仍然可以使用存储的进程运行查询。我想不出这个:/