【问题标题】:Using Isnumeric with wild card in SQL Server在 SQL Server 中使用带通配符的 Isnumber
【发布时间】:2015-11-04 17:51:02
【问题描述】:

我有一个 80 列的表。其中 60 列是数字字段。我想检查列值是否为数字我可以使用

SELECT * FROM IPP where isnumeric(2009)=1

2009 是列名

有没有办法可以在非数字中使用通配符%200%,即

isnumeric('%200%')

因为我每年有大约 60 列,并且这些列会随着时间的推移而增加

我正在尝试这个

SELECT * FROM IPP where isnumeric('%2009%')=1

有可能吗?

【问题讨论】:

  • 没有。但是你可以编写一些动态 SQL 来为你做这件事。这是一个开始:stackoverflow.com/questions/20463365/… 从这个开始,如果遇到困难,请回复。
  • 1.您的数据模型似乎很糟糕。新数据永远不应导致新列,而只能导致新行。 (即您要添加 data 而不是更改 data structure。) 2. 2009 是一个错误的列名。您不应该使用数字作为列名,以避免混淆和使用它们的麻烦。 3. 如果你有 60 个数字列,那么里面的数据当然是 数字的;您不能将非数字放在数字列中。或者你是说你想检查空值? 我的强烈建议:改变你的数据模型。这会让你的事情变得更容易。
  • 问题是客户端将以 2009 列的格式向我们提供文件,我动态地将它们作为 sql server 中的行取消透视。现在我想验证 sql server 中的客户端文件以检查这些列是否应该只有数字字段。
  • 啊,好吧。我想我会检查甚至可能转换文件之前将其导入数据库。
  • 我也这样做了,但是在 excel 中旋转它们需要太多时间,而且对于少数表格来说,它超出了 excel 的限制:(

标签: sql sql-server sql-server-2012


【解决方案1】:

使用 unpivot 可以在一个语句中做到最好,但您仍然必须写入所有列:

DECLARE @t TABLE(id INT IDENTITY, [2008] VARCHAR(100), [2009] VARCHAR(100), [2011] VARCHAR(100))

INSERT INTO @t VALUES
('1.1', 'asd', '1'),
('200.1', '2', '1'),
('11', '3', 'jj')

SELECT * FROM @t
UNPIVOT(a FOR b IN([2008],[2009],[2011]))u
WHERE ISNUMERIC(a) <> 1 AND b LIKE '%200%'

输出:

id  a   b
1   asd 2009

另一种方法是使用动态sql

CREATE TABLE TableTest(id INT IDENTITY, name VARCHAR(100), [2008] VARCHAR(100), [2009] VARCHAR(100), [2011] VARCHAR(100))

INSERT INTO TableTest VALUES
('name1', '1.1', 'asd', '1'),
('name2', '200.1', '2', '1'),
('name3', '11', '3', 'jj')

DECLARE @cols VARCHAR(MAX) = STUFF((SELECT ',' + QUOTENAME(c.name) FROM sys.columns c
JOIN sys.objects o ON o.object_id = c.object_id
WHERE o.name = 'TableTest' AND c.name LIKE '%200%'
FOR XML PATH('')
), 1, 1, '') 


DECLARE @sql VARCHAR(MAX) = 
'SELECT * FROM TableTest
UNPIVOT(a FOR b IN('+@cols+'))u
WHERE ISNUMERIC(a) <> 1'

EXEC(@sql)

输出:

id  name    2011    a   b
1   name1   1       asd 2009

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多