2015-11-04 48 views
1

我有一個80列的表。其中60列是數字字段。我想檢查列值號或不是我能做到這一點,通過使用在SQL Server中對通配符使用Isnumeric

SELECT * FROM IPP where isnumeric(2009)=1 

2009是列名

有沒有一種方法可以讓我在ISNUMERIC即

使用通配符 %200%
isnumeric('%200%') 

因爲我有一年約60列,這些列中會增加在時間

我想這

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

這可能嗎?

+0

不,但你可以編寫一些動態的SQL來爲你做。這裏有一個開始:http://stackoverflow.com/questions/20463365/looping-through-column-names-with-dynamic-sql從這開始,如果你遇到困難,請回復。 –

+3

1.您的數據模型看起來非常糟糕。新數據不應該導致新列,而只會導致新行。 (即你想添加*數據*不改變*數據結構*。)2. 2009年是一個不好的列名。您不應該使用數字作爲列名,以避免混淆和使用它們的麻煩。 3.如果你有60個數字列,那裏的數據*當然是*數字;您不能將非數字放在數字列中。還是你說你想檢查空值? **我強烈的建議:改變你的數據模型。這將使事情變得更容易。** –

+0

問題是客戶端將以2009年將列的格式給我們的文件,我動態地將它們作爲sql server中的行來取消。現在我想驗證sql server中的客戶端文件來檢查這些列應該只有數字字段。 – Mohit

回答

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('[email protected]+'))u 
WHERE ISNUMERIC(a) <> 1' 

EXEC(@sql) 

輸出:

id name 2011 a b 
1 name1 1  asd 2009