2010-08-26 63 views
-3

好吧,不知道爲什麼一家價值數十億美元的公司爲其旗艦SQL服務器的數組函數掠過這就是人們使用MySQL服務器的原因。好的,足夠的咆哮。使用SQL 2005使用SQL 2005進行數組比較。錯誤轉換

比方說,我使用的查詢字符串方法通過複選框收到陣列從另一頁:

intTask = request.querystring("task") 

在這個例子中,intTask =「1,3,5」

然後我使用的查詢

SELECT user.Task FROM user WHERE (user.Task in (" & intTask & ")) 

這給出了一個錯誤:

Conversion failed when converting the nvarchar value '1, 2' to data type int 

User.task列中的數組在這裏= 1,2。 NVARCHAR是數據類型。 intTask是一個字符串。不知道SQL爲什麼試圖將列轉換爲整數,當它假設是一個字符串比較。我已經知道了SQL注入漏洞,該漏洞由頁面的另一個腳本處理。

好的。那麼如何比較使用SQl Server 2005的數組呢?我似乎無法找到任何SQL函數將遍歷2個字符串並比較所有匹配的值。

例如

intTask = 1,2 

user.task = 3,5,7,2,9 

因爲2的,我應該得到一個記錄,因爲2的兩個陣列中存在

UPDATE

是否有一個SQL函數將處理兩個數組和遍歷數組以查找匹配項。類似:

intTask = 「1,3,5」

用戶( 「任務」)= 「3,5,2」

ARR1 =分裂(intTask, 「」)

ARR2 =分裂(用戶( 「任務」), 「」)

對於i = 0至UBound函數(ARR1)

for j=0 to UBound(arr2) 

    if(arr1(i) = arr2(j)) then 

     common_found = true 

    end if 

Next 

下一頁

預先感謝

回答

4

在User.task列的陣列此處= 1,2。 NVARCHAR是數據類型。

因爲1,2是2個整數,你的列是一個nvarchar的,使用 '1', '2',則可能需要前綴勝利ň

看看Arrays and Lists in SQL Server 2005 and Beyond

這裏是一個代碼示例

create table #test (id nvarchar(20)) 
insert #test values('1,2') 
insert #test values('2,3') 
go 

工作

select * from #test 
where id in (N'1,2') 

將失敗

select * from #test 
where id in (1,2) 

消息245,級別16,狀態1,行轉換nvarchar的值 '1,2,3' 爲數據類型int時1個
轉換失敗。

如果你只使用整數,然後使用VARCHAR,不爲nvarchar,nvarchar的使用VARCHAR的雙存儲......當然,如果你正確地normlized數據庫,你不會有這些問題

+0

+1 - 我有那篇文章之前收藏並丟失了,這是一篇很棒的文章。 – LittleBobbyTables 2010-08-26 16:08:44

+0

請在代碼中提供使用「prefix win N」的例子。最好是一個完整的SQL查詢語句。謝謝。 – Patriotec 2010-08-26 16:56:46

+0

看我已添加的代碼 – SQLMenace 2010-08-26 17:13:01