Передайте переменную TABLE в sp_executesql
Я пытаюсь передать переменную TABLE в процедуру sp_executesql:
DECLARE @params NVARCHAR(MAX)
SET @params = '@workingData TABLE ( col1 VARCHAR(20),
col2 VARCHAR(50) )'
EXEC sp_executesql @sql, @params, @workingData
Я получаю сообщение об ошибке:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'TABLE'.
Я пробовал исключить спецификацию столбца после "TABLE". Я также попытался объявить таблицу как переменную внутри динамического SQL. Но не повезло...
Мне кажется, что переменные TABLE не могут быть переданы в качестве параметров в этой процедуре?. BTW: Я запускаю MSSQL2008 R2.
Я не заинтересован в использовании локальной таблицы temp, например, #workingData, потому что загружаю рабочие данные из другой процедуры:
INSERT INTO @workingData
EXEC myProc @param1, @param2
Что я не могу сделать непосредственно в temp varaible (правильно?)...
Любая помощь оценивается!
Ответы
Ответ 1
Если вы используете SQL Server 2008 для передачи переменной таблицы в хранимую процедуру, вы должны сначала определить тип таблицы, например:
CREATE TYPE SalesHistoryTableType AS TABLE
(
[Product] [varchar](10) NULL,
[SaleDate] [datetime] NULL,
[SalePrice] [money] NULL
)
GO
или использовать существующий тип таблицы, хранящийся в базе данных.
Используйте этот запрос для поиска существующих типов таблиц
SELECT * FROM sys.table_types
Чтобы использовать в хранимой процедуре, объявите входную переменную как таблицу:
CREATE PROCEDURE usp_myproc
(
@TableVariable SalesHistoryTableType READONLY
)
AS BEGIN
--Do stuff
END
GO
Настройте переменную таблицы перед переходом к хранимой процедуре:
DECLARE @DataTable AS SalesHistoryTableType
INSERT INTO @DataTable
SELECT * FROM (Some data)
Вызвать хранимую процедуру:
EXECUTE usp_myproc
@TableVariable = @DataTable
Дальнейшие обсуждения здесь.
Ответ 2
ОК, это даст мне то, что я хочу, но, конечно, не очень красиво:
DECLARE @workingData TABLE ( col1 VARCHAR(20),
col2 VARCHAR(20) )
INSERT INTO @workingData
EXEC myProc
/* Unfortunately table variables are outside scope
for the dynamic SQL later run. We copy the
table to a temp table.
The table variable is needed to extract data directly
from the strored procedure call above...
*/
SELECT *
INTO #workingData
FROM @workingData
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM #workingData'
EXEC sp_executesql @sql
Должен быть лучший способ передать этот временный набор результатов в sp_executesql!?
Отношения
Alex
Ответ 3
Хотя это не может напрямую ответить на ваш вопрос, он должен решить вашу проблему в целом.
Вы действительно можете зафиксировать результаты выполнения хранимой процедуры во временной таблице:
INSERT INTO #workingData
EXEC myProc
Итак, измените свой код так, чтобы он выглядел следующим образом:
CREATE TABLE #workingData ( col1 VARCHAR(20),
col2 VARCHAR(20) )
INSERT INTO #workingData
EXEC myProc
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM #workingData'
EXEC sp_executesql @sql
С уважением,
Тим
Ответ 4
Alter PROCEDURE sp_table_getcount
@tblname nvarchar(50) ,
@totalrow int output
AS
BEGIN
Declare @params nvarchar(1000)
Declare @sql nvarchar(1000)
set @sql = N'Select @cnt= count(*) From @tbl'
set @params = N'@tbl nvarchar(50) , @cnt int OUTPUT'
Exec sp_executesql @sql , @params ,@[email protected] , @cnt = @totalrow OUTPUT
END
GO
Обратите внимание, что приведенный выше код не будет работать как таблица, так как объект выходит за пределы области. Он выдаст вам ошибку: должен объявить переменную таблицы. Чтобы обойти это, мы можем сделать следующее.
Alter PROCEDURE sp_table_getcount
@tblname nvarchar(50) ,
@totalrow int output
AS
BEGIN
Declare @params nvarchar(1000)
Declare @sql nvarchar(1000)
set @sql = N'Select @cnt= count(*) From dbo.' + @tblname
set @params = N'@cnt int OUTPUT'
Exec sp_executesql @sql , @params , @cnt = @totalrow OUTPUT
END
GO