Ale*_*lex 22 sql dynamic 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
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'TABLE'.
Run Code Online (Sandbox Code Playgroud)
我尝试在'TABLE'之后省略列规范.我还尝试将表声明为动态SQL中的变量.但没有运气......
在我看来,TABLE变量不允许在此过程中作为参数传递?顺便说一句:我正在运行MSSQL2008 R2.
我对使用像#workingData这样的本地临时表不感兴趣,因为我从另一个过程加载了工作数据:
INSERT INTO @workingData
EXEC myProc @param1, @param2
Run Code Online (Sandbox Code Playgroud)
哪个我不能直接进入临时变速器(对吧?)......
任何帮助赞赏!
Gar*_*del 12
如果您使用的是SQL Server 2008,要将表变量传递给存储过程,您必须首先定义表类型,例如:
CREATE TYPE SalesHistoryTableType AS TABLE
(
[Product] [varchar](10) NULL,
[SaleDate] [datetime] NULL,
[SalePrice] [money] NULL
)
GO
Run Code Online (Sandbox Code Playgroud)
或使用存储在数据库中的现有表类型.
使用此查询可查找现有表类型
SELECT * FROM sys.table_types
Run Code Online (Sandbox Code Playgroud)
要在存储过程中使用,请将输入变量声明为表:
CREATE PROCEDURE usp_myproc
(
@TableVariable SalesHistoryTableType READONLY
)
AS BEGIN
--Do stuff
END
GO
Run Code Online (Sandbox Code Playgroud)
在传递给存储过程之前填充表变量:
DECLARE @DataTable AS SalesHistoryTableType
INSERT INTO @DataTable
SELECT * FROM (Some data)
Run Code Online (Sandbox Code Playgroud)
调用存储过程:
EXECUTE usp_myproc
@TableVariable = @DataTable
Run Code Online (Sandbox Code Playgroud)
在此进一步讨论.
好吧,这会得到我想要的,但肯定不漂亮:
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
Run Code Online (Sandbox Code Playgroud)
一定有更好的方法将这个临时结果集传递到 sp_executesql!?
问候亚历克斯