Передав несколько параметров одного столбца в SQL Server, выберите SP - PullRequest
1 голос
/ 01 июня 2009

У меня есть строковое значение в web.config & mdash; например 2 направляющих, разделенных ",". Мне нужно выполнить динамический запрос к базе данных (т.е. я понятия не имею, сколько значений можно разделить запятой в файле web.config) и выполнить оператор select для таблицы, передав эти значения и получив все, что относится, например:

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

некоторые строки могут содержать только 1 guid, некоторые могут содержать 10

Ответы [ 4 ]

4 голосов
/ 01 июня 2009

Прочитайте отличный пост Erland Sommarskogs на эту тему:

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

SQL Server 2008 также предлагает табличных параметров в дополнение к этим способам передачи нескольких значений в процедуру.

Марк

1 голос
/ 01 июня 2009

это основано на статье Эрланда Соммарскога:

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 @x=@x+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)
1 голос
/ 01 июня 2009

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

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

Но учтите, что такой динамический sql очень опасен. С другой стороны, их безопасная передача может быть хитрой .

0 голосов
/ 01 июня 2009

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

Возможность состоит в том, чтобы проанализировать эту строку в хранимой процедуре 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...