在SQL Server 2000中观察到隐式类型转换

时间:2010-12-03 06:17:47

标签: sql-server sql-server-2000

在我的SQL Server 2K数据库表中有一个varchar zipcode字段,当它遇到数字带连字符的邮政编码时,会输出错误的zipcode字符长度。例如,对于诸如ABC12-1234之类的值,它将发出正确的长度,即10,但是当zipcode类似于21345-5时,它将其长度发送为5而不是7.我想知道如何避免这种隐含的未命名的类型转换。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

所以你的抱怨是,如果有人

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

即他们省略了它将被视为

的引号
INSERT INTO YourTable(ZipCode) VALUES(21340)

并且您希望避免这种情况并因为从int转换为varchar

而引发错误

在任何版本的SQL Server中都无法实现此严格行为。 Though it is a moderately highly voted request on the connect site.

您的语言环境中的所有邮政编码是否都必须包含-个字符?如果是这样,您可以使用检查约束来强制执行此方面,否则您只需要在插入语句中小心操作。

来自您的应用程序的任何插入都应该参数化为正确的类型,所以我认为这只适用于手动插入语句?

答案 1 :(得分:0)

我似乎无法重现这一点 - 这个代码片段在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语句返回错误的长度信息??