Неявное приведение типов наблюдается в SQL Server 2000 - PullRequest
0 голосов
/ 03 декабря 2010

В моей таблице базы данных SQL Server 2K есть поле почтового индекса varchar, которое может выдавать неправильную длину символа почтового индекса, когда он принимает цифровой почтовый индекс через дефис.Например, для таких значений, как ABC12-1234, он будет выдавать правильную длину, т. Е. 10, однако, когда почтовый индекс равен 21345-5, он выдает свою длину как 5 вместо 7. Интересно, как избежать этого неявного невостребованного для приведения типов.Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Таким образом, ваша жалоба заключается в том, что если кто-то делает

INSERT INTO YourTable(ZipCode) VALUES(21345-5)

, то есть он пропускает кавычки, он будет восприниматься как

INSERT INTO YourTable(ZipCode) VALUES(21340)

, и вы хотите, чтобы этого избежать, и возникнет ошибкаиз-за приведения от int к varchar

Такое строгое поведение пока невозможно ни в одной версии SQL Server. Хотя это запрос с умеренным количеством голосов на сайте подключения.

Должны ли все почтовые индексы в вашей локали содержать символ -?Если это так, вы можете применить этот аспект с проверочным ограничением, в противном случае вам просто нужно будет проявить осторожность в ваших операторах вставки.

Любые вставки, поступающие из вашего приложения, должны быть в любом случае параметризованы с правильным типом, поэтому я предполагаю, что это относится только к операторам вставки вручную?

0 голосов
/ 03 декабря 2010

Я не могу воспроизвести это - этот фрагмент работает безупречно на SQL Server 2000:

CREATE TABLE ZipCodeTest(ID INT IDENTITY PRIMARY KEY, ZipCode VARCHAR(20))

INSERT INTO dbo.ZipCodeTest(ZipCode) VALUES('ABC12-1234')
INSERT INTO dbo.ZipCodeTest(ZipCode) VALUES('21345-5')
INSERT INTO dbo.ZipCodeTest(ZipCode) VALUES('ABC')
INSERT INTO dbo.ZipCodeTest(ZipCode) VALUES('32144')

Затем я делаю SELECT для этой таблицы:

SELECT
    ID, ZipCode, LEN(ZipCode)
FROM
    ZipCodeTest

и получите следующий вывод:

ID  ZipCode      LEN        
1   ABC12-1234    10
2   21345-5        7
3   ABC            3
4   32144          5

Ваш "проблемный случай" (с ID = 2) показывает LEN(ZipCode) = 7, как и ожидалось.

Можете ли вы показать нам

  • структура вашего стола
  • ваш оператор SELECT, который возвращает ошибочную информацию о длине ??
...