2009-06-01 6 views
1

J'ai une valeur de chaîne dans le web.config — par exemple 2 guids séparés par un ",". J'ai besoin d'interroger dynamiquement la base de données (ie je n'ai aucune idée du nombre de valeurs séparées par une virgule dans le web.config) et d'exécuter une instruction select sur la table en passant ces valeurs et en obtenant tout ce qui est pertinent par exemple:Passage de plusieurs paramètres de la même colonne à SQL Server sélectionnez SP

select * from tablename where columnname = string1 string2 string3 etc etc 

certaines chaînes ne peuvent contenir 1 guid certains peuvent contenir 10

+0

J'ai ajouté quelques exemples supplémentaires –

Répondre

1

Vous voulez une condition "IN". Si vous vraiment Faites confiance à votre web.config et peut exiger des éléments configurés sont emboîtés entre guillemets, vous pouvez simplement le mettre directement dans l'instruction SQL:

select * from tablename where columnname IN ("web.config value here") 

Mais soyez averti que sql dynamique comme celui-ci est Très dangereux. D'autre part, les transmettre en toute sécurité peut être tricky.

+0

je ne l'ai jamais vu cette approche pourrait être gênant, mais intéressant. –

0

Vous ne devez envoyer plusieurs paramètres, une seule chaîne

A acceuillent pour analyser cette chaîne dans une procédure stockée SQL et construire une requête dynamique

Une autre acceuillent pour insérer le « » caractères à tous, et utiliser au code suivant

'aaa','bbb','ccc' 

myTable 
------------ 
ID Name 

1 eee 
2 aaa 
3 ggg 
4 hhh 
5 bbb 


declare @stmt nvarchar(1000) 
set @stmt = 'select * from myTable where Name in (''aaa'',''bbb'',''ccc'')' 
exec spexecute_sql @stmt 
+0

Je passe ma valeur dynamiquement @myString et il retourne toujours 0 résultats, pouvez-vous aider –

1

Ceci est basé sur l'article Erland Sommarskogs:

http://www.sommarskog.se/arrays-in-sql-2005.html

Avant d'utiliser ma fonction, vous devez mettre en place une table « d'aide », il vous suffit de le faire une fois par base de données:

CREATE TABLE Numbers 
(Number int NOT NULL, 
    CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
DECLARE @x int 
SET @x=0 
WHILE @x<8000 
BEGIN 
    SET @[email protected]+1 
    INSERT INTO Numbers VALUES (@x) 
END 

Utilisez cette fonction pour diviser votre chaîne, qui ne boucle et est très rapide:

CREATE FUNCTION [dbo].[FN_ListToTable] 
(
    @SplitOn    char(1)    --REQUIRED, the character to split the @List string on 
    ,@List     varchar(8000)  --REQUIRED, the list to split apart 
) 
RETURNS 
@ParsedList table 
(
    ListValue varchar(500) 
) 
AS 
BEGIN 

/** 
Takes the given @List string and splits it apart based on the given @SplitOn character. 
A table is returned, one row per split item, with a column name "ListValue". 
This function workes for fixed or variable lenght items. 
Empty and null items will not be included in the results set. 


Returns a table, one row per item in the list, with a column name "ListValue" 

EXAMPLE: 
---------- 
SELECT * FROM dbo.FN_ListToTable(',','1,12,123,1234,54321,6,A,*,|||,,,,B') 

    returns: 
     ListValue 
     ----------- 
     1 
     12 
     123 
     1234 
     54321 
     6 
     A 
     * 
     ||| 
     B 

     (10 row(s) affected) 

**/ 



---------------- 
--SINGLE QUERY-- --this will not return empty rows 
---------------- 
INSERT INTO @ParsedList 
     (ListValue) 
    SELECT 
     ListValue 
     FROM (SELECT 
        LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue 
        FROM (
          SELECT @SplitOn + @List + @SplitOn AS List2 
         ) AS dt 
         INNER JOIN Numbers n ON n.Number < LEN(dt.List2) 
        WHERE SUBSTRING(List2, number, 1) = @SplitOn 
      ) dt2 
     WHERE ListValue IS NOT NULL AND ListValue!='' 



RETURN 

END --Function FN_ListToTable 

vous pouvez utiliser cette fonction comme une table dans une jointure, qui sera rapide et utiliser l'index:

SELECT 
    Col1, COl2, Col3... 
    FROM YourTable 
     INNER JOIN FN_ListToTable(',',@YourString) s ON YourTable.ID = s.ListValue 

vous pouvez diviser des chaînes ou des chiffres, en voici quelques exemples de chaîne:

DECLARE @YourString varchar(8000) 
SET @YourString='monkey,elephant,dog,bear,zebra' 
select * from FN_ListToTable(',',@YourString) 

SET @YourString='two words,three words here,four words right here,five is the magic number,six words is even more fun' 
select * from FN_ListToTable(',',@YourString) 


SET @YourString='Doe, Jane; Smith, Joe; Public, John Q.' 
select * from FN_ListToTable(';',@YourString) 
+0

pouvez-vous aider, j'utilise la chaîne et non les numéros et ne peut pas obtenir votre approche au travail –

+0

Pouvez-vous s'il vous plaît expliquer une table d'assistance –

+0

l'aide table est essentiellement une table nommée Numbers qui contient une colonne "Number", avec une ligne pour chaque nombre de 1 à 8000 ou plus. Quel est votre problème avec la table d'assistance? Il est utilisé par la fonction pour trouver le caractère de division, la table dérivée interne retourne fondamentalement une ligne pour chaque caractère qui contient un caractère de division (aucune boucle impliquée). La table dérivée externe utilise ces lignes pour séparer réellement la chaîne. –

Questions connexes