如何在sql查询中使用参数(sp_executesql不按要求工作)

时间:2015-02-12 05:24:58

标签: sql sql-server

我使用临时表加临时变量.. 现在,当我的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

3 个答案:

答案 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语句中声明的任何变量