我使用临时表加临时变量.. 现在,当我的SQL查询同时具有临时变量和表时,我知道sp_executesql无法正常工作,因为我们无法在其中使用临时表 并且标准执行不会采用变量参数。 如果有人可以帮助我解决其他问题,那将会非常有帮助吗?
这是一个示例代码:
create procedure tryit
as begin
declare @temp as Table_Type;
declare @ghdhj as nvarchar(50)
set @ghdhj='TBVHTempSelectionTable';
declare @sqlstatement nvarchar(max);
set @sqlstatement=N'insert into @temp select * from '+@ghdhj+';';
exec sp_executesql @sqlstatement;
--,@temp='finalResultTable',@ghdhj='TBVHTempSelectionTable'
select * from @temp;
end
go
exec tryit
答案 0 :(得分:1)
创建临时表,然后执行sp_executesql
答案 1 :(得分:1)
如果您首先创建临时表,则应该能够在sp_executesql中访问它,如果您明确指定它
select *
into #peter
from (values (10), (10)) p(a);
exec sp_executesql N'insert into tempdb..#peter values (20), (20)';
select * from #peter;
-- Result
A
10
10
20
20
答案 2 :(得分:1)
sp_executesql可以接受表值参数,因此可以将表变量传递给sp_executesql。
首先,您需要在数据库上定义的表类型。您可以使用CREATE TYPE语句创建表类型。例如:
CREATE TYPE dbo.CategoryTableType AS TABLE
(
CategoryID int,
CategoryName nvarchar(50)
)
GO
获得表类型后,可以将该类型的表变量传递给sp_executesql。例如:
DECLARE @Categories CategoryTableType
INSERT INTO @Categories
VALUES (1, 'Beverages'), (2, 'Confections')
EXEC dbo.sp_executesql
N'SELECT * FROM @Categories',
N'@Categories CategoryTableType READONLY',
@Categories
sp_executesql无法访问传递给sp_executesql的sql语句之外声明的任何类型的变量。
但是,sp_executesql可以访问在调用范围堆栈中创建的临时表。例如:
CREATE TABLE #Categories (
CategoryID int,
CategoryName nvarchar(50)
)
INSERT INTO #Categories VALUES
(1, 'Beverages'), (2, 'Confections')
EXEC dbo.sp_executesql N'SELECT * FROM #Categories'
DROP TABLE #Categories
另一方面,调用作用域无法访问传递给sp_executesql的sql语句中创建的临时表。例如,以下代码将失败,其中包含消息208,级别16,状态0,无效的对象名称“#Categories”。
EXEC dbo.sp_executesql N'
CREATE TABLE #Categories (
CategoryID int,
CategoryName nvarchar(50)
)
INSERT INTO #Categories VALUES
(1, ''Beverages''), (2, ''Confections'')'
SELECT * FROM #Categories
此外,调用范围无法访问传递给sp_executesql的sql语句中声明的任何变量