[英]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.