Sql server MSSQL检查列是否为全数字或空

Sql server MSSQL检查列是否为全数字或空,sql-server,tsql,Sql Server,Tsql,我在表中有一个varchar字段。我必须检查哪些行不包含数字(0-9)。不允许使用任何其他字符(、等) ISNUMERIC没有帮助,因为字符串可能比SQL Server中可转换为数字数据类型的任何字符串都长 有什么办法吗 非常感谢 假设“空”表示NULL: Field NOT LIKE '%[^0-9]%' OR Field IS NULL 获取仅包含数字或为空的值的示例: declare @test table (Field varchar(32)) INSERT @test VA

我在表中有一个varchar字段。我必须检查哪些行不包含数字(0-9)。不允许使用任何其他字符(、等)

ISNUMERIC没有帮助,因为字符串可能比SQL Server中可转换为数字数据类型的任何字符串都长

有什么办法吗

非常感谢

假设“空”表示
NULL

Field NOT LIKE '%[^0-9]%'
    OR Field IS NULL
获取仅包含数字或为空的值的示例:

declare @test table (Field varchar(32))

INSERT @test
VALUES
    (NULL),
    ('121414'),
    ('88977665'),
    ('234234f'),
    ('347238748d9')

select * from @test
where Field not like '%[^0-9]%'
    OR Field is null
领域 空的

121414

88977665

获取包含非数字字符且不为空的值的示例:

declare @test table (Field varchar(32))

INSERT @test
VALUES
    (NULL),
    ('121414'),
    ('88977665'),
    ('234234f'),
    ('347238748d9')

select * from @test
where Field like '%[^0-9]%'
    AND Field is NOT null
领域 234234f

347238748d

您可以尝试查找并拒绝包含非数字字符的值:

declare @t table (field varchar(40))
insert into @t (field)
values
('40340,033680998078'),
('40340'),
('033680998078')

select *
from @t
where patindex('%[^0-9]%',field)=0
此查询无法利用任何索引,必须扫描整个表。最好首先避免在该字段中存储非数字字符

通常,如果字段包含数字数据,则应使用数字类型,而不是varchar。它应该是一个
int
bigint
数值(…,0)

另一方面,该字段可能是存储发票号码、机票或增值税号码等的业务字段

在这种情况下,需要使用
检查
约束来确保不能在表中插入无效值。这可以通过使用PATINDEX实现:

declare @t table 
( 
    field varchar(40) CHECK (patindex('%[^0-9]%',field)=0)
);
此检查约束将允许:

insert into @t (field)
values
('40340'),
('033680998078')
但拒绝:

insert into @t (field)
values
('40340,033680998078')

非常感谢。不幸的是,使用此方法,我没有得到任何结果集,即使其中包含类似“40340033680998078”的数据,这些数据显然包含一些非数字字符。@Stefan Wolf不会从final语句中删除。查询应该是像“%$0-9]”这样的Where字段哦,我的英语还不错-问题中的标题和信息不同,无论如何,我已经更正了我的回答为什么您首先将数字存储为字符串?您想做什么?如果字段应该包含一个数字,那么它应该是数字类型。另一方面,这些数字可能是发票号码或其他业务字段。在任何情况下,SQL都不是进行字符串操作的好语言。如果要检测无效数据,最好使用外部程序查找无效行。如果您想创建一个触发器,最好创建一个使用eg
Int.Parse
或正则表达式的SQLCLR UDF。也许还有其他方法,但没有一种是可行的fast@PanagiotisKanavos有时一串数字有前导零,但没有固定的长度。这对于整型数据类型来说不太好。@HABO我在评论和回答中解释了这一点。如果它有前导零,它不是一个数字。它是一个值仅包含数字的业务字段。增值税编号就是这样一种情况,正如您正确假设的那样,它是一个业务领域。我几乎没有能力修改正在使用数据的程序本身,因此我需要在另一端找到无效数据。不幸的是,遗留代码。这非常有效-我找到了丢失的内容。在每个字段的末尾都有一条看不见的新行。替换了它-现在可以正常工作了!