Несоответствие между MS Sql 2k и 2k5 со столбцами в качестве аргументов функции

У меня проблемы с тем, чтобы в SQL Server 2k работало следующее, но оно работает в 2k5:

--works in 2k5, not in 2k

create view foo as    
SELECT  usertable.legacyCSVVarcharCol as testvar     
FROM  usertable   
WHERE rsrcID in
    (  select val     
       from
       dbo.fnSplitStringToInt(usertable.legacyCSVVarcharCol, default)
    )

--error message:    
Msg 170, Level 15, State 1, Procedure foo, Line 4    
Line 25: Incorrect syntax near '.'.

Итак, legacyCSVVarcharCol - это столбец, содержащий списки INT, разделенных запятыми. Я понимаю, что это огромный WTF, но это устаревший код, и сейчас со схемой ничего нельзя поделать. Передача "testvar" в качестве аргумента функции также не работает в 2k. Фактически, это приводит к немного другой (и даже более странной ошибке):

Msg 155, Level 15, State 1, Line 8

'testvar' is not a recognized OPTIMIZER LOCK HINTS option.

Передача жестко запрограммированной строки в качестве аргумента функции fnSplitStringToInt работает как в 2k, так и в 2k5.

Кто-нибудь знает, почему в 2к не работает? Возможно, это известная ошибка в планировщике запросов? Есть предложения, как заставить его работать? Опять же, я понимаю, что настоящий ответ - «не храните списки CSV в своей базе данных!», Но, увы, это вне моего контроля.

Некоторые образцы данных, если это поможет:

INSERT INTO usertable (legacyCSVVarcharCol) values ('1,2,3');
INSERT INTO usertable (legacyCSVVarcharCol) values ('11,13,42');

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

Обновлено: Понимая, что, возможно, начальный пример был неясным, вот два примера, один из которых работает, а другой нет, что должно подчеркнуть возникающую проблему:

--fails in sql2000, works in 2005

SELECT t1.* 
FROM usertable t1
WHERE 1 in 
    (Select val 
     from 
     fnSplitStringToInt(t1.legacyCSVVarcharCol, ',')
    )

--works everywhere:

SELECT t1.*   
FROM usertable t1
WHERE 1 in 
    ( Select val 
      from 
      fnSplitStringToInt('1,4,543,56578', ',')
    )

Обратите внимание, что единственное различие заключается в том, что первый аргумент для fnSplitStringToInt - это столбец в случае, когда происходит сбой в 2k, и буквальная строка в случае, когда успешно выполняется и то, и другое.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
448
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что функции могут иметь значения по умолчанию в функциях в SS2K.

Что происходит, когда вы запускаете этот SQL в SS2K?

select val     
from dbo.fnSplitStringToInt('1,2,3', default)
Ответ принят как подходящий

Передача значений столбца в определяемую пользователем функцию, возвращающую табличное значение, не поддерживается в SQL Server 2000, вы можете использовать только константы, поэтому следующая (более простая версия) также не сработает:

SELECT *, (SELECT TOP 1 val FROM dbo.fnSplitStringToInt(usertable.legacyCSVVarcharCol, ','))
FROM usertable

Однако, как вы уже выяснили, он будет работать на SQL Server 2005.

Другие вопросы по теме