3

SQLServerで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)
4

3 に答える 3

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、演算子は文字列コレクションではなく整数コレクションを使用します。

于 2012-04-20T05:58:43.853 に答える
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,','))
于 2012-04-20T05:59:34.540 に答える
1

ADO.NET を使用している場合は、マジック ストリングを使用せずに SqlDataRecord を使用できます。

または、SQL Server 2008 を使用している場合は、テーブル値パラメーターを使用してマジック ストリングを回避することもできます。

ソース: http://www.sommarskog.se/arrays-in-sql-2008.html

于 2012-04-20T06:15:56.370 に答える