Используйте строку чисел в качестве SqlParameter для ресурса запроса SQL с оператором IN - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь передать строку p_strIds с числовыми значениями, разделенными ",":

2844099,2844100,2844101,2844102,2844103,2844104,2844105,2844106,2844107,2844108,2844109,2844110,2844111,2844112,2844113,2844114,2844115,2844116,2844117,2844118

Строка используется как SqlParameter:

mySqlCommand.Parameters.Add(new SqlParameter("@p_Ids", p_strValores));

для использования в следующем запросе ресурса ( добавлен как ресурс ) в операторе IN:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (@p_Ids)

Запрос и оператор IN должны заканчиваться так:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (2844099,2844100,2844101,2844102,2844103,2844104,2844105,2844106,2844107,2844108,2844109,2844110,2844111,2844112,2844113,2844114,2844115,2844116,2844117,2844118)

Но он говорит, что не может конвертировать nvarchar в int, как я могу отформатировать параметр для использования в IN (... Ids ...)

Это работает, если я использую параметр p_strIds со строкой. Формат (queryString, p_strIds) так:

queryString = UPDATE tbl_Datos SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') WHERE col_Id in ({0})
strSql = string.Format(queryString, p_strValores)
mySqlCommand = new SqlCommand(strSql, m_obSqlConnection);

есть идеи о том, как это сделать в первом подходе с оператором sql в качестве ресурса?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Здесь вам нужна функция разделения.

создайте функцию разделения, как показано здесь

CREATE FUNCTION [dbo].[SplitString]
(
    @sString nvarchar(2048),
    @cDelimiter nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
    if @sString is null return
    declare @iStart int,
            @iPos int
    if substring( @sString, 1, 1 ) = @cDelimiter 
    begin
        set @iStart = 2
        insert into @tParts
        values( null )
    end
    else 
        set @iStart = 1
    while 1=1
    begin
        set @iPos = charindex( @cDelimiter, @sString, @iStart )
        if @iPos = 0
            set @iPos = len( @sString )+1
        if @iPos - @iStart > 0          
            insert into @tParts
            values  ( substring( @sString, @iStart, @iPos-@iStart ))
        else
            insert into @tParts
            values( null )
        set @iStart = @iPos+1
        if @iStart > len( @sString ) 
            break
    end
    RETURN

END

и затем вы измените свой запрос, как показано ниже:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (Select part from SplitString(@p_Leyenda,','))
0 голосов
/ 12 июля 2018

Наконец, единственный способ - преобразовать строку в список:

List<string> p_Ids= p_strValores.Split(',').ToList();

Затем преобразуйте каждое значение в списке в int и добавьте их в дополнительный список, например, aux_p_Ids, затем используйте его в запросе sql:

UPDATE tbl_Datos SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = @p_Leyenda) WHERE col_Id in aux_p_Ids
0 голосов
/ 05 июля 2018

Столбец col_Id в tbl_Datos или col_Leyenda в таблице tbl_Leyenda объявлен как тип данных NVARCHAR. Вероятно, в этом столбце есть данные, по крайней мере, с некоторыми нечисловыми символами.

Когда SQL пытается запустить ваш оператор WHERE: WHERE col_Id in (@Ids)

Не удается преобразовать нечисловые данные в col_Id в список данных в @Ids, который, как предполагается, является целым числом.

Вы можете исправить это, поместив одинарные кавычки вокруг каждого идентификатора в вашем списке. Это будет выглядеть примерно так:

'2844099','2844100','2844101','2844102','2844103','2844104','2844105','2844106','2844107','2844108','2844109','2844110','2844111','2844112','2844113','2844114','2844115','2844116','2844117','2844118'

Возможно также, что переменная @p_Leyenda передается как целочисленное значение. Вы должны попытаться заставить это быть также и строкой. Аналогично вашему списку col_Ids выше.

...