[英]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 Holidays
的begin
是什么?
那些沒有意義。 它們只對開始和結束while
循環有意義。
IDK,如果這是你的問題的原因,但這是我注意到的第一件事
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.