Как передать и вернуть массив в хранимую процедуру? - PullRequest
0 голосов
/ 26 апреля 2010

Я хотел бы знать, как передать массив в хранимую процедуру, которая, в свою очередь, вернет массив из c # .net?

1 Ответ

4 голосов
/ 26 апреля 2010

Здесь возможны разные варианты в зависимости от сценария. Я использую SQL Server для множества приведенных ниже примеров, но большая часть его широко переносима между системами.

Для относительно небольшого массива (в идеале векторного) вы можете создать строку с разделителями (разделенную табуляцией, разделенную запятыми и т. Д.) И передать ее в свою БД и проанализировать - обычно вручную (в СУБД часто отсутствует подпрограмма "split") но очень легко получить заранее написанную «разделенную» реализацию (например, как UDF в SQL Server). Типичное использование:

SELECT st.*
FROM dbo.SplitUDF(@myarg) #udf
INNER JOIN SOME_TABLE st ON st.ID = #udf.Value

Xml - еще один вариант, особенно для сложных данных; SQL Server 2005 и более поздние версии имеют встроенный синтаксический анализ xml, но в целом это не следует предполагать.

Табличные параметры - это еще один вариант, но это только SQL Server 2008 - вполне возможно, что вы ищете.

Другим вариантом, особенно для больших данных, является закачка данных на сервер отдельно (массовая вставка, SQLBulkCopy, "bcp", SSIS и т. Д.) И обработка данные через SQL, когда они там есть.

Чтобы получить массив / табличные данные, стандартным SELECT должен быть ваш вариант по умолчанию, хотя вы, конечно, также можете создавать xml или символьные данные с разделителями. Последнее может быть достигнуто через причуду SQL:

DECLARE @foo varchar(max)
SET @foo = ''
SELECT @foo = @foo + st.SomeColumn + '|' -- pipe-delimited, note trailing |
FROM SOME_TABLE st
...