2009-11-17 71 views
0

的SQL是:這個SQL有什麼問題?

execute ('delete from HttpRequests where Date < ''2009-08-' + convert(nvarchar(max), 0) + '''') 

的錯誤是

Msg 156, Level 15, State 1, Line 1 
Incorrect syntax near the keyword 'convert'. 

註釋掉轉換部分刪除錯誤。怎麼了?

+0

我會在最後投3票而不是4. – 2009-11-17 19:29:57

+5

由w唉,你知道可以構建一個謂詞字符串而不需要使用動態SQL,對嗎?一般來說,你應該像動態語言中的'eval()'一樣對待SQL中的'execute':一個非常強大的,非常危險的工具,只有在沒有其他工具可以使用時纔會使用它。 – 2009-11-17 19:38:43

+0

你知道嗎,我無法想象你在這裏試圖做什麼,這是不是更好,更安全地使用正常的日期處理函數。實際上,我無法想象通過使用這些結構,你正在嘗試做什麼。 – 2009-12-27 13:50:44

回答

3

EXECUTE (@stringvariable)不允許串聯比@stringvariable1 + @stringvariable2

更復雜的你不得不這樣做:

DECLARE @sql nvarchar(4000) 
SELECT @sql = 'delete from HttpRequests where Date < ''2009-08-' + convert(nvarchar(4000), 0) + ''' 
EXECUTE (@sql) 

但是,那麼你有無效的日期錯誤...和我已經修復了報價錯誤...

12

取代「執行」和「打印」,刪除括號,並運行,你會得到

delete from HttpRequests where Date < '2009-08-0' 

這不是一個有效的日期。

+0

好點,但這是否解釋了編譯錯誤? – 2009-11-17 19:57:50

+0

當涉及語法錯誤時,SQL引發的實際錯誤往往有點......任意。 – 2009-11-17 21:08:42

+1

不,問題在於你不能在EXEC內執行這樣的操作(就像你不能調用EXEC dbo.someProc @foo =(@bar + 1);)。一旦你得到適當的日期格式,使用一個變量作爲佔位符,然後使用EXEC(@variable);. – 2009-11-17 21:19:58

-2

查詢日期喜歡yyyyMMdd並把[max]放在[]之間。

+0

SQL Server可以理解ISO 8601格式的日期(「yyyy-MM-dd」),'nvarchar(max)'是SQL Server的合法語法。 – 2009-11-17 19:43:52

+1

這可以,但是很清楚是什麼意思? Max可能會誤解爲保留字。像yyyyMMdd這樣的日期比含有' - '或'/'的日期更常用。我真的不想閱讀你的代碼丹尼爾,即使它工作.. – 2009-11-17 19:55:17

+0

丹尼爾,YYYYMMDD更安全。試試這個:SET LANGUAGE FRENCH; SELECT CONVERT(DATETIME,'2009-11-13'); – 2009-11-17 21:16:52

1

您似乎沒有創建有效日期。

select 'delete from HttpRequests where Date < ''2009-08-' + convert(nvarchar(max), 0) 

+ '' ''

會給你:從HTTPRequests的刪去日期< '2009-08-0'

2

是沒有錯的發言。 SQL根本不允許將CONVERT表達式的結果傳遞給EXEC。我找不到任何文檔,但很多人都會報告這種行爲。

http://www.eggheadcafe.com/software/aspnet/34917755/pass-result-of-convert-as.aspx

+0

'execute'不會創建存儲過程,因此您的評論不適用。參考:http://msdn.microsoft.com/en-us/library/ms188332.aspx – 2009-11-17 19:45:02

+0

謝謝,我知道。我的觀點是關於將參數傳遞給EXEC。 – 2009-11-17 19:47:42

+0

@LymanZerga:我的錯。我沒有意識到這種行爲。 – 2009-11-17 23:48:05