2009-06-01 4 views
1

У меня есть строковое значение в файле web.config —, например, 2 указателя, разделенные ",". Мне нужно запросить базу данных динамически (т. Е. Я понятия не имею, сколько значений может быть разделено запятой в файле web.config) и запускать оператор select в таблице, передавая эти значения и получая все, что имеет значение, например:Передача нескольких параметров одного столбца на SQL Server Выберите SP

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

некоторые строки могут содержать только 1 GUID некоторые из них могут содержать 10

+0

Я добавил некоторые дополнительные примеры –

ответ

1

Вы хотите состояние "В". Если вы действительно доверие ваш web.config и может потребовать сконфигурированные элементы также заключенная в кавычки, вы можете просто поместить его непосредственно в заявлении SQL:

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

Но имейте в виду, что динамический SQL, как это очень опасно. С другой стороны, их безопасное перемещение может быть tricky.

+0

я никогда не видел такой подход, может запутаться, но интересно. – 2009-06-01 15:01:35

0

Вам не нужно отправить несколько параметров, только одну строку

вешать, чтобы разобрать эту строку в процедуре SQL хранится и построить динамический запрос

Другой вешать это вставить «» символов в каждой, а также использовать для кодирования ниже

'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

Я передаю свое значение динамически @myString, и он всегда возвращает 0 результатов, вы можете помочь – 2009-06-02 08:47:20

1

это основано на Erland Sommarskogs статье:

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

Перед тем, как использовать свою функцию, необходимо создать «вспомогательный» стол, вам нужно только сделать это один раз в базе данных:

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 

использовать эту функцию, чтобы разделить вашу строку, которая не делает петли и очень быстро:

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 

вы можете использовать эту функцию в виде таблицы в объединении, который будет быстро и использовать индекс:

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

можно разделить строки или числа, вот несколько примеров строк:

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

Можете ли вы помочь, я использую строку, а не цифры, и не могу получить ваш подход к работе. – 2009-06-02 08:46:41

+0

Не могли бы вы объяснить вспомогательный стол – 2009-06-02 10:34:00

+0

помощник таблица в основном представляет собой таблицу с именем Numbers, которая содержит столбец «Число», с строкой для каждого номера от 1 до 8000 или более. В чем проблема с вспомогательной таблицей? Он используется функцией для поиска разделительного символа, внутренняя производная таблица в основном возвращает строку для каждого символа, которая содержит разделенный символ (без использования цикла). Внешняя производная таблица использует эти строки для фактического разделения строки. –

Смежные вопросы