簡體   English   中英

更新臨時表

[英]Update A Temp Table

我正在為新的一年創建一些報告。 我解除了這個代碼並嘗試使其適用於臨時表,因為我沒有在我的數據庫上創建表權限。 我注釋掉了PKey部分,因為我認為我不需要它在臨時表中。

我能夠在2099年插入日期,在BankHoliday中插入“N”,在臨時表的HolidayName列中插入“Null”。 但是,當我單獨運行“新年”假期的更新部分或作為一個長查詢時,我得到相同的語法錯誤。 “''附近的語法不正確。” 就在我想我知道自己在做什么的時候......

Declare @FirstDate as Date
Declare @LastDate as Date
Declare @WorkingDate as Date

set @FirstDate = '01-01-2010'
SET @LastDate = '12-31-2099'

-- create holiday table replace # with dbo for permanent table
begin
create table #CACFederalReserverHolidays
(
[Date] Date Not Null,
BankHoliday nvarchar(1) Null,
HolidayName nvarchar(50) Null,
) ON [Primary]
end

----add primary key replace # with dbo for permanent table

--begin
--alter table #CACFederalReserverHolidays add constraint
--PK_CACFederalReserverHolidays Primary Key Clustered
--(
--Date
--)
--With (Statistics_NoRecompute = off,
--  Ignore_Dup_Key = Off,
--  Allow_Row_Locks = On,
--  Allow_Page_Locks = On) On [Primary]
--end

-- insert the first date

Insert into #CACFederalReserverHolidays 
([Date],[BankHoliday])
Values
(@FirstDate,'N')

-- insert the remaining dates by adding 1 to the last date
While (select MAX(DATE)
from #CACFederalReserverHolidays
) < @LastDate

begin
Set @WorkingDate =  DATEADD (day,1,(select MAX(DATE) from #CACFederalReserverHolidays))
if @WorkingDate <= @LastDate
    begin
        insert into #CACFederalReserverHolidays
        ([Date], [BankHoliday])
        Values
        (@WorkingDate, 'N')
            end
    else
        break
end

--ID Fed Holidays
begin
update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) between 2 and 6
    
update #CACFederalReserverHolidays
     set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2
end

begin 
-- MLK Day, 3rd Mon in January
update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'Martin Luther King Day'
    where DATEPART(day,Date) between 15 and 21
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2
end     

我認為您可能在SQL Server(或Management Studio)中發現了一個實際的錯誤。

這兩個UPDATE語句:

update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) between 2 and 6
    
update #CACFederalReserverHolidays
     set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2

似乎在前兩行中有某種無效的空格字符和/或換行符。 但是,當我一次掃描一個字符時,我找不到任何導致此問題的Unicode值。 盡管如此,當我編輯出所有空格和換行符然后手動重新輸入時,查詢不再出現“無效語法”錯誤。

我建議你做同樣的事情。 但首先,我會請求您復制這些行並將它們帶到Microsoft Connect並輸入它們作為可能的錯誤。

(實際上,如果你願意,我很樂意將其輸入MS Connect。)


我在此處將此作為SQL Server錯誤輸入Microsoft Connect: https//connect.microsoft.com/SQLServer/feedback/details/775641/ssms-throws-spurious-incorrect-syntax-error 隨意去那里並對其進行upvote或評論和/或表明你是否可以自己復制它。


我剛想通了。 這是我修改的Connect發布,它很好地解釋了:

當我在SSMS中逐字執行以下文本時:

 update #CACFederalReserverHolidays set BankHoliday = 0 

它會拋出錯誤“''附近的語法不正確'。” 據我所知,它應該只是說#temp表是未定義的。 注意:即使定義了#temp表,也會引發相同的錯誤。

我從支持論壇上的用戶問題得到了這個(這里: 更新臨時表 )。 將用戶的文本剪切並粘貼到我的SSMS中,我能夠將其縮小到這兩行。 經過大量的編輯和測試后,我發現如果我刪除第一行和第二行之間的換行符和空格然后自己重​​新輸入它們,問題就會消失。 懷疑一些看不見/無效的字符,然后我引用了文本並逐字逐句地檢查了它:

 select unicode(substring('update #CACFederalReserverHolidays set BankHolidayX = 0', 35,1)) 

但是查看字符35,36和37,只顯示了Unicode值13,10和63(CR,LF和Space)。

據我所知,這必須是一個錯誤,無論是在Management Studio中,還是在SQL Server Parser本身中。

請注意,到目前為止,我只在SQL Server 2012上重現了這一點,但原始用戶從SQL Server 2008報告了它。


好的,我剛剛意識到上面的檢查程序存在缺陷,因為我在查看Unicode值之前將其轉換為ASCII。 當我使用正確的表達式時:

 select unicode(substring(N'update #CACFederalReserverHolidays set BankHolidayX = 0', 37,1)) 

它揭示了字符37實際上是Unicode值8200.我不熟悉這個但我認為它是無效的。


長話短說,似乎SQL代碼中的一些空格(特別是update..后的set ..行前面的空格update..不是真正的空格(Unicode 63),但實際上是Unicode字符8200(“ PUNCTUATION SPACE“,U + 2008)。顯然你需要用空格來代替它們。

之后--ID Fed Holidaysbegin是什么?

那些沒有意義。 它們只對開始和結束while循環有意義。

IDK,如果這是你的問題的原因,但這是我注意到的第一件事

暫無
暫無

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

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