Выберите @var = результат временной таблицы из функции SQL Server? - PullRequest
0 голосов
/ 10 февраля 2011

Если у меня есть функция, которая возвращает временную таблицу, как мне установить переменную в SQL Server, которая ее сохраняет?

Если результат функции примерно такой:

temp table
    item1 item2...itemn
        1     2...    n

Это действительно?

SELECT @table = * FROM dbo.SOME_FUNCTION()

??

Если это возможно, не могли бы вы привести пример того, как использовать @table var для определения значений?

Если это невозможно, как я могу получить доступ к временной таблице, которую возвращает функция ??

Ответы [ 3 ]

2 голосов
/ 10 февраля 2011

Если функция возвращает таблицу, вы должны иметь возможность:

INSERT INTO @table (Col1, Col2) SELECT * FROM dbo.SOME_FUNCTION()

Вам нужно будет указать столбцы, которые вы собираетесь использовать для части INSERT или SELECTутверждение.

ОБНОВЛЕНИЕ:

Вот кое-что, что я придумал, чтобы вы могли найти столбцы.Первая часть - это включение вашего сервера, чтобы он мог возвращать и использовать сохраненные процессы, как если бы вы работали с обычной таблицей (уточните у своего администратора БД или у того, кто запускает сервер, что у них все в порядке с включенными этими параметрами).Вы выбираете свой набор результатов во временную таблицу, затем запускаете sp_columns сохраненный процесс в tempdb и вставляете его в другую временную таблицу (которую вы затем отбрасываете).Таким образом, вы, по крайней мере, знаете, какие у вас есть столбцы, и, возможно, сможете использовать его, чтобы упростить работу с динамическими именами столбцов.

sp_configure 'Show Advanced Options', 1
GO

RECONFIGURE
GO

sp_configure 'Ad Hoc Distributed Queries', 1
GO

RECONFIGURE
GO

SELECT * INTO #ItemsTable FROM dbo.SOME_FUNCTION()

SELECT * INTO #Columns FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'exec tempdb..sp_columns ''#ItemsTable''')

SELECT COLUMN_NAME FROM #Columns

DROP TABLE #Columns

ДРУГОЕ ОБНОВЛЕНИЕ:

ЕслиВы хотите получить список столбцов для таблицы в базе данных, вы можете использовать этот запрос:

SELECT [name] FROM sys.columns WHERE object_id = (SELECT object_id FROM sys.tables WHERE [name] = 'TableName')

Однако!Если вы собираетесь выполнять этот запрос и создавать таблицы разного размера много раз в день, я бы посоветовал вам придерживаться временных таблиц.Таким образом, вы не будете без необходимости писать в базу данных (кроме tempdb).Если по какой-то причине вам НУЖНЫ постоянные таблицы, создаваемые каждый раз, тогда, я думаю, это тоже хорошо!

1 голос
/ 10 февраля 2011

Используя ваш пример:

Declare @table TABLE
(
Item1 int,
Item2 int,
Item3 int
)

INSERT INTO @table (Item1, Item2, Item3) SELECT * FROM dbo.SOME_FUNCTION()
0 голосов
/ 10 февраля 2011

В SQL Server 2008 вы также можете использовать INSERT ( Документация MSDN )

С этим вы должны уметь:

SELECT * 
INTO new_table 
FROM dbo.SOME_FUNCTION()

Дополнительным преимуществом является то, что вам не нужно сначала объявлять локальную переменную таблицы. Из ссылки на документацию MSDN взята эта выдержка относительно * new_table *:

Указывает имя новой таблицы для быть создан на основе столбцов в список выбора и выбранные строки из источника данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...