,你可以在一個語句中使用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
不,但你可以編寫一些動態的SQL來爲你做。這裏有一個開始:http://stackoverflow.com/questions/20463365/looping-through-column-names-with-dynamic-sql從這開始,如果你遇到困難,請回復。 –
1.您的數據模型看起來非常糟糕。新數據不應該導致新列,而只會導致新行。 (即你想添加*數據*不改變*數據結構*。)2. 2009年是一個不好的列名。您不應該使用數字作爲列名,以避免混淆和使用它們的麻煩。 3.如果你有60個數字列,那裏的數據*當然是*數字;您不能將非數字放在數字列中。還是你說你想檢查空值? **我強烈的建議:改變你的數據模型。這將使事情變得更容易。** –
問題是客戶端將以2009年將列的格式給我們的文件,我動態地將它們作爲sql server中的行來取消。現在我想驗證sql server中的客戶端文件來檢查這些列應該只有數字字段。 – Mohit