簡體   English   中英

SQL存儲過程中的錯誤

[英]Error in SQL stored procedure

執行存儲過程時出現以下錯誤:

Msg 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 我使用下划線來標​​識出於報告目的所需的文件名的組成部分。

除了使用其他人指出的%日期比較的邏輯錯誤外,您當前的問題是語法錯誤。

由於您在另一個動態sql語句中包含一個動態sql語句,因此您需要對所有單引號進行兩次轉義 ,這與大多數查詢中的操作相同,但以下行除外:

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

正確地逃脫,將是:

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

這就提出了一個問題...為什么要構建一個字符串以動態執行,而不是直接調用該語句?

這是“ 2011%”的語法。 這不是有效日期。 %是通配符意味着編譯器無法知道在WHERE子句中要與之進行比較的內容。 您需要使用實際日期:即“ 2011_01_01”,以便編譯器可以知道要與之比較的內容

我相信存儲的proc exec在不同的會話下運行,因此無論如何您都無法訪問temp表。 因此,是否讓該sql語句運行並不重要。 您可以始終使用YEAR(delivered_date) > 2011

另一種方法是使用鏈接服務器的fqn一起選擇並繞過temp表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM