在專案開發過程中,我們經常要做一些以時間為條件的查詢,比如查詢指定時間範圍內的歷史記錄,然而這些時間都是從UI傳遞過來的引數,所以我們寫的sql語句就必須用到字串拼接。當然,在C#中寫SQL語句還好處理,可以使用C#的字串函式做對應的資料型別轉換。但是,如果用的是儲存過程的話,就有點糾結了。下面來說一下我在寫儲存過程中遇到的問題:
為了更加直接的說明問題,寫如下一個簡單的例子:
declare @dateFrom datetime; declare @dateTo datetime; declare @str nvarchar(500); declare @strOne nvarchar(100); declare @strTwo nvarchar(200); declare @sql nvarchar(1000); set @dateFrom = '2014-01-01'; set @dateTo = getdate(); set @strOne = ' and DateCreated >= ' + @dateFrom; set @str = 'select * from Users where 1 = 1'; set @sql = @str + @strOne; print @sql; exec sp_executesql @sql
這個時候,執行SQL的話,就會出現如下錯誤:
分析原因,主要是因為@dateFrom資料型別為Datetime,和字串連線時型別不匹配,所以下面就來做型別轉換:
SQL Server中有個Convert函式,可以用來做型別轉換,用法如下:
定義和用法
CONVERT() 函式是把日期轉換為新資料型別的通用函式。
CONVERT() 函式可以用不同的格式顯示日期/時間資料。
語法
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 規定目標資料型別(帶有可選的長度)。data_to_be_converted 含有需要轉換的值。style 規定日期/時間的輸出格式。
例項
下面的指令碼使用 CONVERT() 函式來顯示不同的格式。我們將使用 GETDATE() 函式來獲得當前的日期/時間:
CONVERT(VARCHAR(19),GETDATE()) CONVERT(VARCHAR(10),GETDATE(),110) CONVERT(VARCHAR(11),GETDATE(),106) CONVERT(VARCHAR(24),GETDATE(),113)
結果類似:
Dec 29 2008 11:45 PM 12-29-2008 29 Dec 08 29 Dec 2008 16:25:46.635
參照上面用法,我們修改程式碼如下:
declare @dateFrom datetime; declare @dateTo datetime; declare @str nvarchar(500); declare @strOne nvarchar(100); declare @strTwo nvarchar(200); declare @sql nvarchar(1000); set @dateFrom = '2014-01-01'; set @dateTo = getdate(); -- set @strOne = ' and DateCreated >= ''' + convert(nvarchar(20),@dateFrom,20) + ''''; -- set @strTwo = ' and DateCreated <= ''' + convert(nvarchar(20),@dateTo,20) + ''''; set @strOne = ' and t68DateCreated between ''' + convert(nvarchar(20),@dateFrom,20) + ''' and ''' + convert(nvarchar(20),@dateTo,20) + ''''; -- select * from Authors_t68 where Users between @dateFrom and @dateTo set @str = 'select * from Authors_t68 where 1 = 1'; -- set @sql = @str + @strOne + @strTwo; set @sql = @str + @strOne; print @sql; exec sp_executesql @sql
這個時候,執行,就可以查詢出結果了。兩種拼接方法,註釋掉的使用了兩個條件來限定時間範圍,後一種方法用的是between...and方法。