Сравнение массивов с использованием SQL 2005. Ошибка преобразования - PullRequest
0 голосов
/ 26 августа 2010

Хорошо, не знаю, почему многомиллиардная компания экономит на функциях массива для своих флагманских серверов SQL. Вот почему люди используют MySQL Server.Хорошо, хватит разглагольствовать.Использование SQL 2005.

Допустим, я получил массив с помощью флажка с другой страницы, используя метод querystring:

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"

user ("task") = "3,5,2"

ARR1 = split (intTask,",")

ARR2 = split (пользователь ("задача"), ",")

для i = от 0 до UBound (arr1)

for j=0 to UBound(arr2)

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

       common_found = true

    end if

Next

Далее

Заранее спасибо

1 Ответ

4 голосов
/ 26 августа 2010

Массив в столбце User.task здесь = 1,2.NVARCHAR - это тип данных.

, поскольку 1,2 - это 2 целых числа, а ваш столбец - nvarchar, используйте '1', '2', вам может потребоваться префикс win N

взгляните на Массивы и списки в SQL Server 2005 и более поздних версиях

Вот пример кода

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

works

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

потерпит неудачу

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

Сообщение 245, Уровень 16, Состояние 1, Строка 1
Преобразование не удалось при преобразовании значения nvarchar '1,2,3' в тип данных int.

Если вы используете только целые числа, тогда используйте varchar, а не nvarchar, nvarchar использует двойное хранилище varchar ... конечно, если вы правильно нормируете БД, у вас не будет этих проблем

...