如果将以下select语句置于动态查询中,则该语句不起作用。如果它移出动态查询
,它可以正常工作DECLARE @sid UNIQUEIDENTIFIER , @AttributeID UNIQUEIDENTIFIER
SET @sid = 'c0b5956b-47f2-4ad6-bb9a-67a5a249e4b7'
SET @AttributeID = 'F1A0D9D6-702E-4492-9EBC-63AD22E60E6A'
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM
(select [CaseID],
( select
Attr.AttributeValue
from
[dbo].[CV_CaseAttributes] Attr
Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
) AS CaseTitle
,[UserID]
FROM [dbo].[CaseMaster] C
WHERE SpaceID = @sid
)
AS Details'
EXEC sp_executesql @sql
,N'@sid UNIQUEIDENTIFIER,@AttributeID UNIQUEIDENTIFIER'
,@sid=@sid,@AttributeID =@AttributeID
错误消息
Msg 102,Level 15,State 1,Line 2
','附近的语法不正确。
Msg 156,Level 15,State 1,Line 8
关键字“AS”附近的语法不正确。
为什么会这样?
答案 0 :(得分:1)
使用它(缺少一个SELECT
因此错误消息):
'SELECT * FROM
(SELECT [CaseID],
( select
Attr.AttributeValue
from
[dbo].[CV_CaseAttributes] Attr
Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
) AS CaseTitle
,[UserID]
FROM [dbo].[CaseMaster] C
WHERE SpaceID = @sid
)
AS Details'
编辑 - 根据评论:
试
DECLARE @sidV UNIQUEIDENTIFIER , @AttributeIDV UNIQUEIDENTIFIER
SET @sidV = 'c0b5956b-47f2-4ad6-bb9a-67a5a249e4b7'
SET @AttributeIDV = 'F1A0D9D6-702E-4492-9EBC-63AD22E60E6A'
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM
(select [CaseID],
( select
Attr.AttributeValue
from
[dbo].[CV_CaseAttributes] Attr
Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
) AS CaseTitle
,[UserID]
FROM [dbo].[CaseMaster] C
WHERE SpaceID = @sid
)
AS Details'
EXEC sp_executesql @sql
,N'@sid UNIQUEIDENTIFIER,@AttributeID UNIQUEIDENTIFIER'
,@sid=@sidV,@AttributeID =@AttributeIDV
编辑 - 根据评论“解释”:
我不是SQL Server专家,所以请将以下内容作为猜测:
对我而言,似乎解析器将EXEC
后面的内容视为新范围。
因此,当按名称解析变量时,它首先在EXEC
的范围内进行检查,并且在找不到它所寻找的内容时将其扩展到周围范围。
在原始语句的情况下,我们在两个范围中都有2个变量命名相同(外部与内部EXEC
) - 这在执行EXEC
内的代码时解决这些变量时会导致一些问题不使用EXEC
之外的声明变量。
通过在两个范围内将名称更改为唯一,解析器不再存在这些问题......