在SQL Server中使用带有通配符的Isnumeric

时间:2015-11-04 09:20:09

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

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

来做到这一点
SELECT * FROM IPP where isnumeric(2009)=1

2009是列名

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

isnumeric('%200%')

因为我有大约60列的年份,这些列将随着时间的推移而增加

我正在尝试这个

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

有可能吗?

1 个答案:

答案 0 :(得分: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