繁体   English   中英

如何在SQL Server中使用IN运算符

[英]How to use IN Operator in SQL Server

如何在SQL Server中使用IN运算符

这是表格结构

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)

你使用错误的方式

使用以下方式

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运算符使用整数集合而不是字符串集合..

你应该使用一个函数来返回一个结果集(采用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,','))

如果您使用的是ADO.NET,则可以避免使用魔术字符串,只需使用SqlDataRecord即可。

或者,如果您使用的是SQL Server 2008,则还可以通过使用表值参数来避免魔术字符串

资料来源: http//www.sommarskog.se/arrays-in-sql-2008.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM