变量中的单引号

Single quotes in a variable

知道为什么当我在变量中硬编码值时这个 Select IN 不起作用吗?

set quoted_identifier off

declare @IPAddressList   varchar(100)

Select @IPAddressList = "'108.61.51.101', '206.221.181.5'"   -- double quotes surrounding single quoted IP addresses

Select @IPAddressList  --- this shows as is:   '108.61.51.101', '206.221.181.5'

-- This returns nothing, but expect it to return rows just like the 2nd select below.
Select *
from dbo.DDoSAttacks
where TargetIP IN (@IPAddressList)

-- This does return rows as expected. 
Select *
from DDoSAttacks
where TargetIP IN ('108.61.51.101', '206.221.181.5')

set quoted_identifier on

你需要一个答案,否则人们会继续访问这个问题。但是 Marc_S 评论是正确的:

IN 运算符需要一个值列表(整数或字符串)- 但如果您提供 @IPAddressList varchar(100),则您提供的是单个字符串值

如果你想让它工作,你可以创建一个函数,将你的分隔字符串解析为 table,然后对 table 中的值执行 "IN" .

CREATE FUNCTION [dbo].[fn_ParseDelimited] 
(
    @ParseString varchar(MAX),
    @Delimiter   varchar(10)
)
RETURNS @tbl TABLE (value varchar(MAX))
AS
BEGIN
    DECLARE @i int, @j int

    declare @lenParseString int;
    set @lenParseString = LEN(@ParseString);

    DECLARE @lenDelimiter int;  
    set @lenDelimiter = LEN(@Delimiter);

    SELECT @i = 1
    WHILE (@i <= @lenParseString)
    BEGIN
        select  @j = CHARINDEX(@Delimiter, @ParseString, @i)
        IF @j = 0
        BEGIN
            SELECT @j = @lenParseString + 1;
        END

        INSERT @tbl SELECT SUBSTRING(@ParseString, @i, @j - @i)
        SELECT @i = @j + @lenDelimiter
    END
    RETURN
END

然后你可以像这样使用你的函数:

select dd.* from 
dbo.DDosAttacks dd 
inner join dbo.fn_ParseDelimited(@IPAddressList,',') lst
on dd.TargetIP = lst.Value

你应该使用动态 SQL,像这样:

declare @sql nvarchar(255)
select @sql='Select * from dbo.DDoSAttacks where TargetIP IN ('+@IPAddressList+')';
EXECUTE sp_executesql @sql

参见:dynamic sql