SQL存储过程出错

Tim*_*vra -1 sql

我执行我的存储过程时收到以下错误:

消息102,级别15,状态1,行
6'2011'附近的语法不正确.
(1排受影响)

这是存储过程:

ALTER PROCEDURE [dbo].[DeliveryFileNames]
AS
BEGIN
    SET NOCOUNT ON;

    declare @SQL nvarchar(4000)

    Create Table #DelivTemp(
        Style nvarchar(50),
        Material nvarchar(50),
        Filename nvarchar(100),
        delivered_date date)

    set @SQL=
    N'insert into #DelivTemp
    Select distinct Style,Material,filename 
    from OPENQUERY(GCS_PRODUCTION,
    ''SELECT LEFT(FILENAME,locate(''''_'''',FILENAME)-1)as Style,
        substring_index(filename,''''_'''',2)as Material,filename,
        delivered_date FROM view_delivery_log
        where delivered_date > ''2011%'' order by Style '')'

    exec (@SQL)

    drop table dbo.DelivFN

    Select * into dbo.DelivFN
    from #DelivTemp

END
Run Code Online (Sandbox Code Playgroud)

我使用OpenQuery从SQL Server 2008 R2上的链接服务器更新SQL表.

我知道,下划线是一个真正的问题,但我已经试过的选项,包括过多\,%以及单,双引号.

无论我得到相同的结果.我可以独立于存储过程运行查询并获得正确的结果.格式化多次引用的文件名字段00000000_ABC4_A.png.我使用下划线来标​​识出于报告目的所需的文件名组件.

Mic*_*son 5

除了使用%其他人指出的日期比较的逻辑错误之外,您当前的问题是语法错误.

由于你有另一个动态sql语句中包含的动态sql语句...你需要双重转义所有单引号...你在大多数查询中都做了,除了以下行:

where delivered_date > ''2011%'' order by Style '')'
Run Code Online (Sandbox Code Playgroud)

适当逃脱,将是:

where delivered_date > ''''2011%'''' order by Style '')'
Run Code Online (Sandbox Code Playgroud)

这引出了一个问题......为什么要构建动态执行的字符串,而不是直接调用语句?