我有一个80列的表。其中60列是数字字段。我想检查列值是否为Number或Not我可以使用
来做到这一点SELECT * FROM IPP where isnumeric(2009)=1
2009
是列名
有没有办法可以在isnumeric中使用通配符%200%
,即
isnumeric('%200%')
因为我有大约60列的年份,这些列将随着时间的推移而增加
我正在尝试这个
SELECT * FROM IPP where isnumeric('%2009%')=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