【问题标题】:how to EXEC a multiline SELECT? [closed]如何执行多行选择? [关闭]
【发布时间】: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) 不能。)

标签: sql tsql


【解决方案1】:

你的SQL开头和结尾加了太多引号,你不需要把动态SQL用自己的引号括起来,把开头和结尾的'''去掉就行了

set @sql = '
with
cte_rag as...
...
and cs.projectid = p.ProjectId
'

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多