SQL存储过程中出现错误

SQL存储过程中出现错误,sql,Sql,我在执行存储过程时遇到以下错误: 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),

我在执行存储过程时遇到以下错误:

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
消息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
我正在使用OpenQuery从SQLServer2008R2上的链接服务器更新SQL表

我知道下划线是一个真正的问题,但我尝试了大量的选项,包括
\
%
,以及单引号和双引号


不管怎样,我都得到了同样的结果。我可以独立于存储过程运行查询并获得正确的结果。多次引用的文件名字段的格式为
00000000\u ABC4\u A.png
。我使用下划线来标识报告所需的文件名组件。

这是“2011%”的语法。这不是一个有效日期。%通配符意味着编译器不知道在WHERE子句中比较什么。您需要使用一个实际日期:即“2011\u 01\u 01”,这样编译器就可以知道要与什么进行比较。我相信存储的进程
exec
在不同的会话下运行,因此您无论如何都无法访问临时表。所以,运行sql语句并不重要。您可以始终使用
年份(交付日期)>2011

另一种方法是使用链接服务器的fqn一起选择并绕过临时表:

SELECT LEFT(FILENAME,locate('_',FILENAME)-1)as Style,
    substring_index(filename,'_',2)as Material,filename,delivered_date 
FROM [linked_server_name].[db_name].[dbo].view_delivery_log
into dbo.DelivFN

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

因为在另一个动态sql语句中包含了一个动态sql语句。。。你需要对所有单引号进行双转义。。。在大多数查询中都执行了此操作,但以下行除外:

where delivered_date > ''2011%'' order by Style '')'
正确地逃脱,将是:

where delivered_date > ''''2011%'''' order by Style '')'

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

我一开始确实尝试过,但还是出现了错误。我在其他存储过程中也使用过这种方法,而且效果非常好。我同意日期。您的代码是正确的执行方式。如前所述,当我使用fqn运行它时,有一些东西导致了很多问题。这在过去很管用。如果
delivered\u date
不是日期/日期时间列,而是varchar呢?您的#temp表有4列,而insert语句只有3列。因此,一旦您修复了解析问题,那么您将在插入时得到一个错误。您需要为日期列显式地添加一个值,为它设置一个默认值,或者在insert上使用一个适当的列列表并将其保留。