您正在创建的表是一个表变量,在其初始范围之外不可用。有几种方法可以解决此问题:
创建一个全局临时表(免责声明:如果多个用户同时尝试运行它,这可能会导致问题。):
create table ##specsAndModel
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
INSERT INTO ##specsAndModel
VALUES('[modelNumber]', 'F00-B4R')
DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT specName, specVal FROM ##specsAndModel'
EXECUTE(@query)
创建一个本地临时表而不是全局:
create table #specsAndModel
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
INSERT INTO #specsAndModel
VALUES('[modelNumber]', 'F00-B4R')
DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT specName, specVal FROM #specsAndModel'
EXECUTE(@query)
在动态 SQL 中执行创建表(丑陋):
DECLARE @query NVARCHAR(MAX);
SET @query = 'DECLARE @specsAndModel TABLE
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
INSERT INTO @specsAndModel
VALUES(''[modelNumber]'', ''F00-B4R'')
SELECT specName, specVal FROM @specsAndModel'
exec(@query)
与其使用临时表,不如创建一个实际表,然后在完成后将其删除 (免责声明:如果多个用户同时尝试运行它,这可能会导致问题。):
create TABLE specsAndModel
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
INSERT INTO specsAndModel
VALUES('[modelNumber]', 'F00-B4R')
DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT specName, specVal FROM specsAndModel'
EXECUTE(@query)
drop table specsAndModel
这是有关临时表和表变量的讨论的链接:
我应该使用#temp 表还是@table 变量?
编辑:您可以使用以下方法传入表变量sp_executesql
:
create type specsAndModel as table (
specName VARCHAR(50)
,specVal VARCHAR(50)
)
go
declare @t specsAndModel
insert @t VALUES('[modelNumber]', 'F00-B4R')
exec sp_executesql N'select specName, specVal from @var', N'@var specsAndModel readonly', @t
使用全局 ##temp 表和永久表都会存在风险,因为如果多个用户尝试运行该进程,则可能会发生冲突。
使用本地 #temp 表或使用sp_executesql
.