приведение нескольких целочисленных значений в sql - PullRequest
0 голосов
/ 08 октября 2010

Я бы хотел привести несколько переменных, которые приходят из решения .net, к целому числу.Примерно так: я использую ключевое слово IN для выбора более одного ключевого слова, потому что я не знаю, сколько переменных выбрано клиентом, и помещаю их в переменную nvarchar.

Пример:

StatusID выбрано: 30,40,50

'30, 40,50 'передается в качестве параметра sql nvarchar на сервер sql

, и я хочу преобразовать их в целое число и иметьчто-то вроде: IN (приведение (30,40,50 как int)). Таким образом, я получаю сообщение об ошибке.

Может кто-нибудь помочь мне, как я могу установить правильный синтаксис sql.Спасибо, Лазиале

Ответы [ 4 ]

1 голос
/ 08 октября 2010

Вы можете сделать это на сервере sql, но мне это не нравится:

CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
returns @Results TABLE (Items nvarchar(4000))  
as
begin
declare @index int
declare @slice nvarchar(4000)
select @index = 1
if @String is null return
while @index != 0
begin
select @index = charindex(@Delimiter,@String)
if @index !=0
select @slice = left(@String,@index - 1)
else
select @slice = @String
insert into @Results(Items) values(@slice)
select @String = right(@String,len(@String) - @index)
if len(@String) = 0 break
end return
end

А потом:

WHERE someintegerfield IN (select * from dbo.Split('30,40,50', ','))
0 голосов
/ 08 октября 2010
SELECT *
FROM YourTable
WHERE StatusId IN(CAST('30' AS int),CAST('40' AS int),CAST('50' AS int))
0 голосов
/ 08 октября 2010

Вы используете тег .NET.Вы используете ADO.NET?Вы настраиваете текстовый запрос или вызываете сохраненный процесс?

Для простого ванильного Transact-SQL, если у вас есть строка, представляющая список значений, вам придется проанализировать строку и преобразоватькаждое значение в целое число.Нет встроенной функции Split (), как в .NET, но у вас есть подстрока и функции index-of для поиска и извлечения чисел.Затем преобразуйте каждое в целое число и сохраните их во временной таблице или табличной переменной, которую вы будете использовать в предложении IN.

Для большинства приложений .NET вы должны использовать эту строку как частьзапроса в виде строки, для любого парсера команды запроса, который у вас есть.Если это базовый ADO, то это будет SQL, для NHibernate это будет HQL и т. Д. Просто настройте запрос на основе строк и отправьте его на SQL Server, и он все разберется в команду, без преобразованияс вашей стороны необходимо.

0 голосов
/ 08 октября 2010

Лучше всего построить sql на клиенте и затем отправить его в SQL, потому что на стороне SQL Server это сделать невозможно.

Вы можете сделать это следующим образом:

string parameters = "30, 40, 50";
string sqlFormat = "SELECT * FROM MY_TABLE WHERE FIELD IN({0})";
string sql = String.Format(sqlFormat, parameters );
myReader = command.ExecuteReader(sql);

ОБНОВЛЕНИЕ

Для тех друзей, которые считают, что это открывается для SQL-инъекция , список номеров создается приложением, и пользователь выбирает только элементы из списка.Так что это не открыто для пользователя и возможно внедрение SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...