2010-12-10 15 views
0

ich eine dynamische in Anweisung in Cursor haben und in eine Sammlung von Zeichenketten:Dynamische IN mit Cursor

DECLARE @DBs nvarchar(4000) 
    SET @DBs="'aaa','bbb','ccc','ddd'" 

DECLARE CompanyDBCursor CURSOR FOR 
    SELECT Interid 
    FROM tableName 
    WHERE interid in (@DBs) 

aber es scheint, einen Fehler - Ungültige Spaltenname

+1

Geben Sie die Anweisung CREATE TABLE für die Tabelle an, aus der Sie auswählen möchten. –

+0

CREATE TABLE [dbo]. [Tabellenname] (................, [INTERID] [char] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, ........ ..) –

+0

Entfernen Sie die Anführungszeichen aus den @ DBs = "... um zu beginnen. Verwenden Sie dann einfache Anführungszeichen, um innerhalb des Literals zu entkommen. –

Antwort

0
diese

Versuchen:

DECLARE @DBs varchar(8000) 
     SET @DBs='aaa,bbb,ccc,ddd' 


DECLARE CompanyDBCursor CURSOR FOR 
    SELECT Interid 
    FROM tableName 
    WHERE interid in (SELECT * FROM dbo.SPLIT(@DBs,',')) 

Hier ist die Tabellenwertfunktion:

CREATE FUNCTION [dbo].[SPLIT] (
    @str_in VARCHAR(8000), 
    @separator VARCHAR(4) 
) 
RETURNS @strtable TABLE (strval VARCHAR(8000)) 
AS 
BEGIN 
    DECLARE @Occurrences INT, @Counter INT, @tmpStr VARCHAR(8000) 
    SET @Counter = 0 
    IF SUBSTRING(@str_in,LEN(@str_in),1) <> @separator 
     SET @str_in = @str_in + @separator 

    SET @Occurrences = (DATALENGTH(REPLACE(@str_in,@separator,@separator+'#')) - DATALENGTH(@str_in))/ DATALENGTH(@separator) 
    SET @tmpStr = @str_in 
    WHILE @Counter <= @Occurrences 
    BEGIN 
     SET @Counter = @Counter + 1 
     INSERT INTO @strtable VALUES (SUBSTRING(@tmpStr,1,CHARINDEX(@separator,@tmpStr)-1)) 
     SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@separator,@tmpStr)+1,8000) 
     IF DATALENGTH(@tmpStr) = 0 
      BREAK 
    END 
    RETURN 
END 
+0

Wirklich es ist out of the box :) –