-1

执行存储过程时出现以下错误:

消息 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 从 SQL Server 2008 R2 上的链接服务器更新 SQL 表。

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

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

4

3 回答 3

5

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

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

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

正确逃脱,将是:

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

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

于 2013-02-04T21:58:29.247 回答
1

这是''2011%''的语法。这不是一个有效的日期。% 作为通配符意味着编译器不知道在 WHERE 子句中要比较什么。您需要使用实际日期:即 ''2011_01_01'' 以便编译器知道要比较什么

于 2013-02-04T21:52:44.660 回答
0

I believe the stored proc exec runs under a different session, therefore you won't have access to the temp table anyway. So, it won't matter if you get that sql statement to run. You could always use YEAR(delivered_date) > 2011.

Another approach would be to use the fqn for the linked server to select into and bypass the temp table all together:

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
于 2013-02-04T21:55:38.883 回答