Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 动态查询不在EXEC上运行_Sql_Tsql_Dynamic - Fatal编程技术网

Sql 动态查询不在EXEC上运行

Sql 动态查询不在EXEC上运行,sql,tsql,dynamic,Sql,Tsql,Dynamic,在下面的查询中,当我使用print语句时,完整的查询会按预期打印出来,我可以选择它并执行,没有问题。但是如果我没有打印它,而是用EXEC运行它,我会得到一个错误 通过获取查询的某些部分并说它是不正确的标识符来表示不正确的语法,就好像执行者只看到部分查询而不是完整查询一样。如您所见,我使用的是varchar(max),它应该适合整个查询字符串。有人有什么想法吗?谢谢 declare @RollUp varchar = "hello" DECLARE @SQL VARCHAR(MAX) SET @

在下面的查询中,当我使用print语句时,完整的查询会按预期打印出来,我可以选择它并执行,没有问题。但是如果我没有打印它,而是用EXEC运行它,我会得到一个错误 通过获取查询的某些部分并说它是不正确的标识符来表示不正确的语法,就好像执行者只看到部分查询而不是完整查询一样。如您所见,我使用的是varchar(max),它应该适合整个查询字符串。有人有什么想法吗?谢谢

declare @RollUp varchar = "hello"
DECLARE @SQL VARCHAR(MAX) 
SET @SQL =
'INSERT INTO #RESULT 
SELECT CONVERT(VARCHAR,"[Member0].[MEMBER_CAPTION]") AS Zeroth,
CONVERT(VARCHAR,"[Member1].[MEMBER_CAPTION]") AS First,
CONVERT(VARCHAR,"[Member2].[MEMBER_CAPTION]") AS Second,
CONVERT(VARCHAR,"[Member3].[MEMBER_CAPTION]") AS Third,
CONVERT(VARCHAR,"[Member4].[MEMBER_CAPTION]") AS Fourth,
CONVERT(VARCHAR,"[Member5].[MEMBER_CAPTION]") AS Fifth,
CONVERT(VARCHAR,"[Member6].[MEMBER_CAPTION]") AS Sixth,
CONVERT(VARCHAR,"[Member7].[MEMBER_CAPTION]") AS Seventh,
CONVERT(MONEY,"[Measures].[MyMeasure]") AS Eighth
FROM OPENROWSET(''MSOLAP'',''DataSource=MyServer;Initial Catalog=Sales'' ,''    
WITH MEMBER [Measures].[MyMeasure]
AS (SUM (StrToMember("[Trans Date].[Year - Quarter - Month - Date].[Month].&["+ Format(Now(),"yyyyMM") + "]").lag(12)
:StrToMember("[Trans Date].[Year - Quarter - Month - Date].[Month].&["+ Format(Now(),"yyyyMM") + "]").lag(1)    
,[Measures].[Revenue])) 
SELECT NON EMPTY([Measures].[MyMeasure]) on 0,
NON EMPTY({[Commission Category Current].[EP Business Line].[Business Line].members *
[Sales].[Product].members *
[Territory].[Territories].[Territory].members *
[Purchasing Site].[Customers].[Customer].members *
[Purchasing Site].[Cust ID].Children *
[Site].[Customers].[Customer].members *
[Site].[Cust ID].Children} *
[Territory].[Countries].[Territory RollUp].&[''' + @RollUp + ''']
) on 1  FROM SALES
)'''


DECLARE @SQL1 VARCHAR(MAX)= Replace(Replace(@SQL, '[''', '['), ''']', ']')

print @sql1

EXEC @SQL1
运行
exec
时,不知道表
#Result
。它是在外部范围中定义的,但不是在内部范围中继承的。您不能像这样使用临时表,除非它们是全局临时表(前面是
##
,而不仅仅是
#


此外,在SQL Server中,决不能使用没有长度的
varchar()
。默认长度取决于上下文,可能不够长。换句话说,在
convert()
语句中应该有
varchar()的长度

EXEC(@STR1+@STR2+@STR3+@STR4)

我不确定varchar(max)如何不接受明显长度不超过1000个字符的动态字符串。除非编辑器正在添加隐藏字符


无论如何,已修复。

尝试语法检查
print
语句的结果。对于您的回答,我将更新varchar,这是我的一个懒惰举动,但我不认为这是问题所在。它位于SP内部,在SP级别声明变量使动态查询的执行者可以使用它,而不需要全局变量。全局会话是危险的,因为多个会话都可以访问它们,并且可以更改它们。在我的情况下,我需要将所有内容都包含在sp当前正在运行的会话中。