如何在SQL Server中使用IN Operator
这是表格结构
Create Table Sample(Id INT,Name Varchar(50))
虽然我是这样的查询,但我可以获得价值
Select * FROM Sample WHERE Id IN ('74','77','79','80')
当我执行上述查询时,我无法获取与该表相关的记录,导致错误执行此错误。
DECLARE @s VARCHAR(MAX)
SET @s='74','77','79','80'
Select * FROM Sample WHERE Id IN (@s)
答案 0 :(得分:2)
你使用错误的方式
使用以下方式
DECLARE @s VARCHAR(MAX)
DECLARE @d VARCHAR(MAX)
SET @s='74 , 77 , 79 , 80'
set @d = 'select * from arinvoice where arinvoiceid in('+@s+')'
exec (@d)
这里IN
运算符使用整数集合而不是字符串集合..
答案 1 :(得分:2)
你应该使用一个函数来返回一个结果集(采用csv格式并返回一个表)
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Splitt] (@String NVARCHAR(4000),
@Delimiter CHAR(1))
RETURNS @Results TABLE (
Items NVARCHAR(4000))
AS
BEGIN
DECLARE @Index INT
DECLARE @Slice NVARCHAR(4000)
SELECT @Index = 1
IF @String IS NULL
RETURN
WHILE @Index != 0
BEGIN
SELECT @Index = Charindex(@Delimiter, @String)
IF @Index <> 0
SELECT @Slice = LEFT(@String, @Index - 1)
ELSE
SELECT @Slice = @String
IF ( NOT EXISTS (SELECT *
FROM @Results
WHERE items = @Slice) )
INSERT INTO @Results
(Items)
VALUES (@Slice)
SELECT @String = RIGHT(@String, Len(@String) - @Index)
IF Len(@String) = 0
BREAK
END
RETURN
END
现在你可以写:
DECLARE @s VARCHAR(MAX)
SET @s='74,77,79,80'
Select * FROM Sample WHERE Id IN (select items from dbo.Splitt(@s,','))
答案 2 :(得分:1)
如果您使用的是ADO.NET,则可以避免使用魔术字符串,只需使用SqlDataRecord。
或者如果您使用的是SQL Server 2008,也可以使用表值参数来避免魔术字符串