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

У меня проблемы с получением следующего для работы в 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.

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

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

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

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

РЕДАКТИРОВАТЬ: Понимая, что, возможно, первоначальный пример был неясным, вот два примера, один из которых работает, а другой - нет, что должно подчеркнуть возникшую проблему:

--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 и литеральная строка в случае, который завершается успешно в обоих случаях.

Ответы [ 2 ]

1 голос
/ 08 сентября 2008

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

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

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

0 голосов
/ 25 августа 2008

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

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

select val     
from dbo.fnSplitStringToInt('1,2,3', default)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...