变量中的单引号
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
知道为什么当我在变量中硬编码值时这个 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