必须声明表变量“@myTable”

4
DECLARE @myTable TABLE( 
Name VARCHAR(50), 
Year INT, 
Hours INT ) 

INSERT INTO @myTable *.... some values*

DECLARE @var INT 
SET @var = 2015

DECLARE @DynamicPivot VARCHAR(MAX) 

SET @DynamicPivot = 'SELECT * FROM
@myTable  PIVOT( SUM(Hours) FOR Year IN (' + @var + ') ) AS PvtTable

EXEC sp_executesql @DynamicPivot

我正在尝试创建一个动态表格并使用Pivot旋转表格。@var中的值是已经存在于动态表Year INT中的值。除了在尝试执行动态Pivot时出现错误之外,一切都正常。尽管我同时运行整个代码,但它仍然给出了@myTable未声明的错误。问题可能出在pivot声明上,但我真的找不到问题所在。有任何想法吗?


使用动态查询的原因是什么?@var 变量来自哪里? - qxg
4
动态查询之外声明的变量对动态查询不可用。我认为这里没有必要使用动态查询。 - Raj
使用 sp_executesql 执行的动态 SQL 会在与其余 SQL 不同的批处理中运行。 - Chris Pickford
我认为它可以使用临时表,但不能使用表变量。 - Gordon Linoff
3个回答

6

使用 # 临时表和 sp_executesql 只能与 nvarchar 一起使用:

CREATE TABLE #myTable ( 
    Name VARCHAR(50), 
    Year INT, 
    Hours INT
) 

INSERT INTO #myTable *.... some values*

DECLARE @var INT 
SET @var = 2015

DECLARE @DynamicPivot NVARCHAR(MAX) 

SET @DynamicPivot = '
SELECT * 
FROM #myTable
PIVOT( 
SUM(Hours) FOR Year IN ([' + CAST(@var as nvarchar(10)) + '])
) AS PvtTable'

EXEC sp_executesql @DynamicPivot

DROP TABLE #myTable

在括号中的IN语句中也不需要引号,因为YEAR和@var都是int类型。 - HoneyBadger
@HoneyBadger 不确定引号的问题,现在无法检查 :) - gofr1
1
括号肯定不对,那会将@var识别为属性。 - HoneyBadger
刚刚检查了一下,这样做行不通(如果@yearint类型,并且我们将其作为参数放入动态SQL中,会出现“将数据类型nvarchar转换为int时出错”的错误和“在PIVOT运算符中提供了错误的值“@year”。”),我撤销了修改。 - gofr1

5
应该在动态查询中使用表变量。
DECLARE @DynamicPivot VARCHAR(MAX) 

SET @DynamicPivot = '
DECLARE @myTable TABLE( 
Name VARCHAR(50), 
Year INT, 
Hours INT ) 

INSERT INTO @myTable *.... some values*

DECLARE @var INT 
SET @var = 2015

SELECT * FROM
@myTable  PIVOT( SUM(Hours) FOR Year IN (' + @var + ') ) AS PvtTable'

EXEC sp_executesql @DynamicPivot

4
尝试这个:必须在动态查询中声明变量。
DECLARE @DynamicPivot VARCHAR(MAX) 

DECLARE @var INT 
SET @var = 2015

SET @DynamicPivot = '
DECLARE @myTable TABLE( 
Name VARCHAR(50), 
Year INT, 
Hours INT ) 

INSERT INTO @myTable *.... some values*

SELECT * FROM
@myTable  PIVOT( SUM(Hours) FOR Year IN (' + @var + ') ) AS PvtTable'

EXEC sp_executesql @DynamicPivot

那个答案对我很有帮助,值得记住的是,在SSMS中通过F5运行时,您需要选择整个操作(包括Declare行)。 - Reven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接