2010-07-12 36 views
-1

[撤回問題:問題源於不是轉義以Web表單提交的值。 ASP腳本刪除轉義空間,從而導致該問題。]使用LIKE的SQL Server查詢在VBScript下有空格問題

在網頁中我試圖開展反對使用VBScript中的MS SQL Server中的表的搜索。搜索使用LIKE子句(使用通配符)。如果輸入中沒有空格,搜索工作正常。但是,如果輸入中有空格,則搜索不會返回任何內容。

例如,如果我搜索IT Department,我什麼也沒得到,但如果我搜索Department,我會得到IT Department。不知何故,ITDepartment之間的空間正在引起麻煩。如果我直接反對使用SQL Server Management Studio中,使用IT Department返回正確結果的搜索服務器運行該腳本。

另外,如果我不使用SQL佔位符參數,而是放在搜索字符串直接,搜索工作。

只有在搜索字符串包含空格和使用佔位符搜索失敗的情況。

這裏是我使用的代碼:

Dim oCmd, OffDescParam, description, query 
description = "IT Department" 
Set oCmd = Server.CreateObject("ADODB.Command") 

OffDescParam = "%" & description & "%" 
Set objOffDescParam = _ 
    oCmd.CreateParameter("@offdesc", adChar, adParamInput, Len(OffDescParam), OffDescParam) 

query = "SELECT OfficialDescription " & _ 
     "FROM [MyDatabase].[dbo].[Organizations] " & _ 
     "WHERE (OfficialDescription LIKE ?)" & _ 
     "ORDER BY OfficialDescription" 
' If I use "WHERE (OfficialDescription LIKE '%IT Department%')" it works. 

oCmd.ActiveConnection = "some/connection/string" 
oCmd.ActiveConnection.CursorLocation = adUseClient 
oCmd.CommandType = adCmdText 
oCmd.CommandText = query 

oCmd.Parameters.Append objOffDescParam 
oCmd.Prepared = True 
Set oRst = CopyRecordSet(oCmd.Execute) 
oCmd.ActiveConnection.close 
+0

回抽問題:這個問題從沒有逃避在Web表單提交的值出現。 ASP腳本刪除未轉義的空間,從而導致問題。 – rlandster 2010-09-04 05:47:09

回答

0

不它需要是...

"WHERE (OfficialDescription LIKE '?')" & _ 
+0

否佔位符(參數)被正確引用的字符串替換。請參閱http://support.microsoft.com/kb/200190。 – rlandster 2010-07-12 21:55:24

0

您的代碼對我的作品(當然其實我對得到一個錯誤CopyRecordSet行,但我懷疑這只是與我的VBScript/ADO版本有關)

在Profiler中,我看到以下內容

declare @p1 int 
set @p1=1 
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%' 
select @p1 

當我在Management Studio中直接運行這個

declare @p1 int 
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%' 
select @p1 

我回來的結果。也許嘗試使用profiler您的結尾,看看是否全部如預期。

0

有兩件事你可以嘗試,壽它看起來像你做正確:

  • ADO或SQL Server可以偶爾表現以令人驚訝的方式,當你使用adChar。請嘗試使用adVarChar
  • VB的Len function有時會返回的字節數(儘管一個字符串,它不應該。)嘗試手動計算串的長度和該傳遞到CreateParameter
+0

我嘗試過'adVarChar',結果相同。我不知道你的意思是手動計算字符串的長度。有什麼方法可以計算VB中字符串的長度,而不是用「Len」? – rlandster 2010-07-12 21:53:26

+0

@ rlandster:你可以通過'15'而不是'Len(OffDescParam)'。這是一個長鏡頭,因爲你清楚地傳遞了一個字符串 – Andomar 2010-07-12 22:15:05