Как проверить, соответствует ли список значений строки, разделенных запятыми, целому числу? - PullRequest
0 голосов
/ 07 июля 2019

Ниже я добавил SQL-запрос.

Я хотел получить список записей, соответствующих условию. Я передаю целочисленные значения в параметры @ClassID и @SectionID. Проблема в том, что ce.Class_ID и ce.Section_ID представляют собой списки строковых значений, разделенных запятыми.

SELECT ce.ID AS CircularEntryCount
FROM dbo.CircularEntry ce
WHERE ce.AcademicYearID = 1 
  AND (ce.Circular_Date = @CurrentDate OR CAST(ce.Created_Date AS date) = @CurrentDate)
  AND (ce.CircularApplicableForID = 1 OR ce.CircularApplicableForID = 3)
  AND (ce.Class_ID = @ClassID OR ce.Class_ID = '0') 
  AND (ce.Section_ID = @SectionID OR ce.Section_ID = '0')

PS: я использовал функцию разделения строк для разделения значений на отдельные столбцы и сравнил то же самое с параметрами, но это показывает.

Ошибка преобразования типа данных nvarchar в bigint

(     
      @List nvarchar(2000),
      @SplitOn nvarchar(1)
)
RETURNS @RtnValue table (
      Id int identity(1,1),
      Value nvarchar(100)
)
AS
BEGIN
      While (Charindex(@SplitOn,@List)>0)
      Begin 
            Insert Into @RtnValue (value)
            Select 
                  Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
      End 

      Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
EN

1 Ответ

0 голосов
/ 07 июля 2019

Правильное решение состоит в том, чтобы решить проблему - что означает изменение структуры базы данных, чтобы вообще не хранить строки с разделителями, а вместо этого нормализовать данные и использовать внешние ключи.
Для получения дополнительной информации читайте Действительно ли плохо хранить список с разделителями в столбце базы данных? , и не только принятый ответ Билла Карвина, но и другие ответы.

Если вы не можете изменить структуру базы данных, вы можете использовать обходной путь, используя like:

SELECT ce.ID AS CircularEntryCount
FROM dbo.CircularEntry ce
WHERE ce.AcademicYearID = 1 
  AND (ce.Circular_Date = @CurrentDate OR CAST(ce.Created_Date AS date) = @CurrentDate)
  AND (ce.CircularApplicableForID = 1 OR ce.CircularApplicableForID = 3)
  AND (','+ ce.Class_ID +',' LIKE '%,'+ CAST(@ClassID as varchar(20)) +'%,' OR ce.Class_ID = '0') 
  AND (','+ ce.Section_ID +',' LIKE '%,'+ CAST(@SectionID as varchar(20)) +'%,' OR ce.Section_ID = '0')

Обратите внимание на приведение к varchar(20) - минимальное значение bigint содержит знак минус и 19 цифр. Если тип данных @ClassID или @SectionID имеет тип int, вместо него можно привести varchar(11).

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