2015-05-22 51 views
1
SELECT * FROM MyTable WHERE MyRow IN ('100','200','300') 

试图通过声明这样一个局部变量上面做:如何声明一串字符串?

DECLARE @What VARCHAR(MAX) 
SET @What = '100','200','300' 
SELECT * FROM MyTable WHERE MyRow IN (@What) 

有什么办法,使这项工作?有“试”这样的:

SET @What = "'100','200','300'" 

这:

SET @What = ('100','200','300') 

第一个是最符合逻辑的,因为它可以多在任何其他语言,但SQL中使用。 @What的长度会有所不同,所以我不能每个都只有一个变量。

如何声明一个本地字符串变量来包含字符串?

+0

“因为它可以多在其他语言中使用,但SQL”真的吗?你可以命名任何其他语言,系统将检查一个* single *字符串参数的内容,找到内部的逗号并决定将其转换为*多个*参数?我不知道有这样的行为。在这种语言中,如何将逗号作为参数的合法部分的参数传递给它? –

+0

我正在讨论带双引号的字符串中带单引号的字符串。在SQL中,双引号不存在。 – Espen

回答

4

这里有一个办法做到这一点,有一个表变量:

DECLARE @What TABLE(txt VARCHAR(MAX)) 
INSERT INTO @What (txt) VALUES ('100'),('200'),('300') 
SELECT * FROM MyTable WHERE MyRow IN (SELECT txt FROM @What) 

这里的a sqlfiddle证明以上。

0

我想如果您将列表作为逗号分隔列表传递并将其转换为表格,会更好。这里有一个工作示例:

DECLARE @What VARCHAR(MAX) = '100,200,300'; 
DECLARE @XmlData AS XML = CAST(('<X>' + REPLACE(@What, ',', '</X><X>')+'</X>') AS XML); 
DECLARE @Test TABLE (What INT); 


INSERT INTO @Test 
SELECT N.value('.', 'INT') FROM @XmlData.nodes('X') AS T(N); 

SELECT * 
FROM MyTable AS M 
WHERE EXISTS (
    SELECT 1 
    FROM @Test AS T 
    WHERE T.What = M.MyRow 
    ); 
0

你可以写为:

DECLARE @MyTable TABLE (MyRow VARCHAR(MAX)) 
INSERT INTO @MyTable VALUES ('100'),('200'),('300') 


DECLARE @What VARCHAR(MAX) 
SET @What = '100,200,300' 

declare @xml xml 

set @xml = N'<root><r>' + replace(@What,',','</r><r>') + '</r></root>' 

SELECT * FROM @MyTable WHERE MyRow IN 
(
select 
    t.value('.','varchar(max)') as [MyRow items] 
from @xml.nodes('//root/r') as a(t) 
)