将温度 table 传递给 EXEC sp_executesql
Pass temp table to EXEC sp_executesql
如何将临时 table (@table) 传递给 EXEC sp_executesql @query
set @query = 'SELECT GsName, ' + @cols + ' from
(
select GSName, [THour], NumOfTransactions
from @table
) x
pivot
(
max([NumOfTransactions])
for [THour] in (' + @cols + ')
) p '
你这里的不是Temporary Table, but a Table-Valued Parameter。
Table-valued parameters are declared by using user-defined table
types. You can use table-valued parameters to send multiple rows of
data to a Transact-SQL statement or a routine, such as a stored
procedure or function, without creating a temporary table or many
parameters.
sp_executesql 确实支持 table 值参数,但它们必须是声明类型。
-- So, first we must declare User-Defined Table Type
CREATE TYPE udtYB_Test AS TABLE(GSName nvarchar(100), THour time, NumOfTransactions int);
GO
-- Now we can create Table-Valued Parameter
Declare @table udtYB_Test;
-- And store there some data
Insert Into @table (GSName, THour, NumOfTransactions)
Values ('Sample', SYSUTCDATETIME(), 1);
-- Just for the reference
Select * From @table;
-- To pass variable to sp_executesql we need parameters definition
DECLARE @ParmDefinition nvarchar(500) = N'@table udtYB_Test READONLY';
-- Please note: table-valued parameter must be READONLY
-- Here I use simplified query for demonstration only
DECLARE @query nvarchar(500) = 'SELECT * FROM @table';
-- and the result should be identical to the reference above
EXECUTE sp_executesql @query, @ParmDefinition, @table = @table;
-- User-Defined Table Type cleanup
DROP TYPE udtYB_Test;
GO
在大多数实际情况下,使用临时文件要容易得多 table:
Create Table #table (GSName nvarchar(100), THour time, NumOfTransactions int);
Insert Into #table (GSName, THour, NumOfTransactions) Values ('Sample', SYSUTCDATETIME(), 1);
Select * From #table;
DECLARE @query nvarchar(500) = 'SELECT * FROM #table';
EXECUTE sp_executesql @query;
Drop Table #table;
如何将临时 table (@table) 传递给 EXEC sp_executesql @query
set @query = 'SELECT GsName, ' + @cols + ' from
(
select GSName, [THour], NumOfTransactions
from @table
) x
pivot
(
max([NumOfTransactions])
for [THour] in (' + @cols + ')
) p '
你这里的不是Temporary Table, but a Table-Valued Parameter。
Table-valued parameters are declared by using user-defined table types. You can use table-valued parameters to send multiple rows of data to a Transact-SQL statement or a routine, such as a stored procedure or function, without creating a temporary table or many parameters.
sp_executesql 确实支持 table 值参数,但它们必须是声明类型。
-- So, first we must declare User-Defined Table Type
CREATE TYPE udtYB_Test AS TABLE(GSName nvarchar(100), THour time, NumOfTransactions int);
GO
-- Now we can create Table-Valued Parameter
Declare @table udtYB_Test;
-- And store there some data
Insert Into @table (GSName, THour, NumOfTransactions)
Values ('Sample', SYSUTCDATETIME(), 1);
-- Just for the reference
Select * From @table;
-- To pass variable to sp_executesql we need parameters definition
DECLARE @ParmDefinition nvarchar(500) = N'@table udtYB_Test READONLY';
-- Please note: table-valued parameter must be READONLY
-- Here I use simplified query for demonstration only
DECLARE @query nvarchar(500) = 'SELECT * FROM @table';
-- and the result should be identical to the reference above
EXECUTE sp_executesql @query, @ParmDefinition, @table = @table;
-- User-Defined Table Type cleanup
DROP TYPE udtYB_Test;
GO
在大多数实际情况下,使用临时文件要容易得多 table:
Create Table #table (GSName nvarchar(100), THour time, NumOfTransactions int);
Insert Into #table (GSName, THour, NumOfTransactions) Values ('Sample', SYSUTCDATETIME(), 1);
Select * From #table;
DECLARE @query nvarchar(500) = 'SELECT * FROM #table';
EXECUTE sp_executesql @query;
Drop Table #table;