2010-12-10 41 views
0

j'ai une dynamique déclaration curseur et contient une collection de chaînes:dynamique IN avec le curseur

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

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

mais il semble une erreur - non valide NomColonne

+1

Veuillez publier l'instruction CREATE TABLE pour la table que vous essayez de sélectionner. –

+0

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

+0

Enlevez les doubles guillemets autour de @DBs = "... pour commencer, puis utilisez des guillemets simples pour vous échapper à l'intérieur du littéral –

Répondre

0

Essayez ceci:

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,',')) 

Voici la fonction de la valeur de la table:

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

Vraiment c'est hors de la boîte :) –