Передайте переменную TABLE в sp_executesql - PullRequest
22 голосов
/ 23 ноября 2010

Я пытаюсь передать переменную 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 нельзя передавать в качестве параметров в этой процедуре ?.Кстати: я использую MSSQL2008 R2.

Меня не интересует использование локальной временной таблицы, такой как #workingData, потому что я загружаю рабочие данные из другой процедуры:

INSERT INTO @workingData
     EXEC myProc @param1, @param2

, которую яне может делать это непосредственно во временном порядке (верно?) ...

Любая помощь приветствуется!

Ответы [ 4 ]

12 голосов
/ 01 января 2011

Если вы используете 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

Дальнейшие обсуждения здесь .

3 голосов
/ 24 ноября 2010

ОК, это даст мне то, что я хочу, но, конечно, не красиво:

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

2 голосов
/ 25 ноября 2011

Хотя это может и не дать прямого ответа на ваш вопрос, это должно решить вашу проблему в целом.

Вы действительно можете записать результаты выполнения хранимой процедуры во временную таблицу:

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    

С уважением, Тим

0 голосов
/ 16 мая 2012
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 ,@tbl=@tblname ,  @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...