【发布时间】:2023-03-19 06:38:01
【问题描述】:
以下exec 正在生成此异常:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '
with
cte_rag as
(select
rc.RagColumnId
,rc.RagId
,rc.Header
,rc.FormElementId
,rc.BaseObjectColumnName
,b.BaseObjectTy'.
Completion time: 2021-11-29T12:58:41.5681063-06:00
这是完整的 sql:
declare @sql nvarchar(max)
set @sql = '''
with
cte_rag as
(select
rc.RagColumnId
,rc.RagId
,rc.Header
,rc.FormElementId
,rc.BaseObjectColumnName
,b.BaseObjectTypeId
,b.BaseObjectTypeName
,b.TableName
from rag.rags r
join rag.RagColumns rc
on r.RagId = rc.ragid
join rag.BaseObjectTypes b
on r.BaseObjectTypeId = b.BaseObjectTypeId
),
cte_scalar_data (projectid,formdataid,formlementid,displayvalue) as (
SELECT
p.ProjectId,
fd.formdataid,
t.FormElementId,
(CASE
WHEN t.FormDataAdapterId IS NOT NULL
THEN dbo.GetFormDataAdapterValue(t.FormDataAdapterId, se.Value)
ELSE
ISNULL(
CASE WHEN t.FormElementTypeId IN (4,5)
THEN
dbo.GetOptionCaption(t.FormElementId, se.Value)
ELSE
CASE WHEN t.FormElementTypeId = 3
THEN
FORMAT(CONVERT([datetime], se.Value), ''yyyy-MM-dd'')
ELSE
CASE WHEN t.FormElementTypeId = 7
THEN
se.Value2
ELSE
se.Value
END
END
END, t.OptionCaption)
END) AS DisplayValue
FROM
Projects p
INNER JOIN FormData fd ON fd.ObjectId = p.ProjectId
INNER JOIN
(SELECT
e.FormId,
e.FormElementId,
e.FormElementTypeId,
e.Name,
e.Title,
da.FormDataAdapterId,
e.Title AS ValueName,
o.Caption AS OptionCaption,
e.PermanentName
FROM
FormElements e
LEFT JOIN FormElementDataAdapters da ON e.FormElementId = da.FormElementId
LEFT JOIN FormElementOptions o ON o.FormElementId = e.FormElementId AND o.IsDefault = 1
WHERE e.FormElementId IS NOT NULL AND e.FormElementTypeId IN (1,3,4,5,7) ) t
ON t.FormId = fd.FormId
LEFT JOIN FormScalarElementsData se ON fd.FormDataId = se.FormDataId AND t.FormElementId = se.FormElementId
)
select r.header
,r.FormElementId
,r.BaseObjectColumnName
,r.BaseObjectTypeName
,fe.FormId
,fd.ObjectId
,p.projectid
,c.cipid
,fd.FormDataId
,cs.displayvalue
from cte_rag r
left join formelements fe
on fe.FormElementId = r.FormElementId
left join formdata fd
on fd.FormId = fe.FormId
left join dbo.projects p
on fd.objectid = p.projectid
left join dbo.cips c
on fd.objectid = c.CipId
left join cte_scalar_data cs
on cs.formdataid = fd.FormDataId
and cs.formlementid = r.FormElementId
and cs.projectid = p.ProjectId
'''
exec(@sql)
我做错了什么?我们如何运行这个exec 命令?
【问题讨论】:
-
单引号已经尊重多行。如果没有,并且三重
'''语法有效,那么您不需要像使用文字''yyyy-MM-dd''那样转义单引号。你为什么在这里使用EXEC(@SQL)?通常这将用于动态 SQL,但您的 SQL 没有任何动态。 (也强烈建议您使用sys.sp_executesql执行SQL 字符串,因为它可以参数化,而EXEC (@SQL)不能。)