我创建了一个动态存储过程,如下所示。
我可以保存这个没有错误,但是当我执行它时,它似乎无法识别@temp变量,因为它抛出以下错误:“必须声明表变量”@temp“。”
这可能是因为错误的引号/转义,如果,我如何更改它以使其正确(我对SQL很新,所以一些引号可能是错误的或丢失的)?
我的SP(第一部分):
@selection nvarchar(100)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
DECLARE @temp AS TABLE
(
ranking int,
item nvarchar(100),
groupCount int,
groupName nvarchar(100)
)
DECLARE @sql nvarchar(max)
SET @sql = '
INSERT INTO @temp
(
ranking,
item,
groupCount,
groupName
)
SELECT RANK() OVER(ORDER BY COUNT(*) desc, policy) [Rank],
' + @selection + ',
COUNT(*) AS groupCount,
''currentMonth'' AS groupName
FROM Log_PE
WHERE CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + ''01'', 112)
GROUP BY ' + @selection + '
ORDER BY groupCount desc, ' + @selection + '
...
非常感谢提供任何帮助,迈克。
答案 0 :(得分:1)
正如我在评论部分已经提到的,Dynamic Sql有自己的范围,在该范围之外声明的任何变量对于动态sql都是不可见的,你必须在动态sql中声明变量。如下所示......
SET @sql = N' DECLARE @temp AS TABLE
(
ranking int,
item nvarchar(100),
groupCount int,
groupName nvarchar(100)
)
INSERT INTO @temp
(
ranking,
item,
groupCount,
groupName
)
SELECT RANK() OVER(ORDER BY COUNT(*) desc, policy) [Rank],
' + @selection + ',
COUNT(*) AS groupCount,
''currentMonth'' AS groupName
FROM Log_PE
WHERE CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + ''01'', 112)
GROUP BY ' + @selection + '
ORDER BY groupCount desc, ' + @selection + '
答案 1 :(得分:0)
希望你做得很好, 好吧,我想你可能会重新考虑使用变量表,因为SQL不会理解@temp变量在执行EXEC(@sql)时的含义,我建议使用临时表而不是变量表,这里&#39 ;新代码:
BEGIN
SET NOCOUNT ON;
BEGIN
if object_id('temp') is not null
drop table temp
create table temp
(
ranking int,
item nvarchar(100),
groupCount int,
groupName nvarchar(100)
)
DECLARE @sql nvarchar(max)
SET @sql = '
INSERT INTO temp
(
ranking,
item,
groupCount,
groupName
)
SELECT RANK() OVER(ORDER BY COUNT(*) desc, policy) [Rank],
' + @selection + ',
COUNT(*) AS groupCount,
''currentMonth'' AS groupName
FROM Log_PE
WHERE CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + ''01'', 112)
GROUP BY ' + @selection + '
ORDER BY groupCount desc, ' + @selection + '
...
if object_id('temp') is not null
drop table temp
我希望你会帮助你
答案 2 :(得分:0)
当您执行EXEC或sp_executesql时,您将获得进程空间的另一个名称空间(范围)。从表变量更改为本地临时表#temp。
下面是一个使用sp_who2的简单示例,说明如何使用本地临时表。
此致
Ĵ
代码段
-- CREATE LOCAL TABLE
CREATE TABLE #WHO2
(
[spid] int not null
, [status] varchar (255) not null
, [login] varchar (255) not null
, [host_name] varchar (255) not null
, [blk_by] varchar(10) not null
, [db_name] varchar (255) null
, [command] varchar (255) not null
, [cpu_time] int not null
, [disk_io] int not null
, [last_batch] varchar (255) not null
, [program_name] varchar (255) null
, [spid2] int not null
, [request_id] int not null
); ;
-- DYNAMIC SQL
DECLARE @VAR_TSQL VARCHAR(MAX);
SET @VAR_TSQL = 'INSERT #WHO2 EXEC sp_who2';
EXECUTE (@VAR_TSQL);
GO
-- TABLE PERSISTS UNTIL SPID (CONNECTION) IS BROKEN
SELECT * FROM #WHO2