2016-09-22 64 views
0

我有一個列名稱的SQL Server表,如INT115,INT430等及其相應的數據。我想將INT115列中的數據乘以115,將INT430列中的數據乘以430,等等。我不知道如何繼續。SQL從列名稱提取信息

編輯:我需要解析列名,並擺脫左3個字符來提出乘數。

Edit2:我正在使用grandfathered表,所以我無法更改數據庫的外觀。問題後

+3

列名 - 不是一個好方法。附件A:您已經有問題繼續工作 – Fabio

+2

您可能需要使用動態SQL才能執行此操作。 –

+1

你應該閱讀數據庫規範化。 –

回答

1

編輯進行了更新

這不需要任何硬編碼在所有: 你可以光標來,通過列名解析,以獲得乘積值一個臨時表,然後從你的表和選擇會給你乘以價值。我使用'sampletable'作爲你的表名。這假定每列都以INT開頭,然後立即有一個數字。

SELECT COLUMN_NAME, 
    CAST(SUBSTRING(COLUMN_NAME, 4, 10)as INT) as multiplier_number 
    INTO #values FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'sampletable' 

DECLARE @sSql nvarchar(max) 
DECLARE @columnname nvarchar(50) 

DECLARE thing CURSOR 
    FOR 
     (
     SELECT COLUMN_NAME 
     FROM #values 
     ) 
OPEN thing 
FETCH NEXT FROM thing 
    INTO @columnname 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    Set @sSql = 'SELECT ' + @columnname + '* (SELECT multiplier_number FROM #values where column_name = '''+ @columnname+''') as '[email protected]+' FROM sampletable' 

EXEC sp_Executesql @sSql 

FETCH NEXT FROM thing into @columnname 
END 
CLOSE THING 
DEALLOCATE THING 
+0

對不起,我改變了這個問題,因爲我想它可能會導致硬編碼的答案像你的。但感謝努力。 – Zanam

+0

但是,您如何知道該列具有「15」或「115」? – Rahul

+0

我更新了我的答案,因此不需要硬編碼。我從INFORMATION_SCHEMA解析列名以獲得與乘法一起使用的值,例如。 INT115具有乘法值115,INT99具有99等等,以表示您擁有的列數。 – sample

1

您可以如以下運行一個簡單的SELECT語句:

select col1*15 as <heading>, col2*30 as <heading> 
from <schema>.<tablename> 

例如

$ db2 "create table test(col15 int, col30 int)" 
DB20000I The SQL command completed successfully. 

db2 "insert into test values (1,1),(2,2),(3,3)" 
DB20000I The SQL command completed successfully. 

db2 "select col15*15, col30*30 from test" 

1   2 
----------- ----------- 
     15   30 
     30   60 
     45   90 

    3 record(s) selected. 

希望這會有所幫助。

2

不知道所期望的結果應該是什麼樣子,但如果你不希望所有字段名代碼,這或許可以幫助

Declare @YourTable table (ID int,INT115 int,INT430 int,INT550 int) 
Insert into @YourTable values 
(1,25,75,18), 
(2,10,1,22) 

Declare @XML xml 
Set @XML = (Select * from @YourTable for XML RAW) 

;with cteBase as (
    Select ID  = r.value('@ID','int') 
      ,Item = attr.value('local-name(.)','varchar(100)') 
      ,Value = attr.value('.','varchar(250)') 
    From @XML.nodes('/row') as A(r) 
    Cross Apply A.r.nodes('./@*[local-name(.)!="ID"]') as B(attr) 
) 
Select ID 
     ,Item 
     ,OldValue = value 
     ,NewValue = cast(Right(Item,3) as int)*Value 
From cteBase 
Where Item Like 'INT___' 

返回

ID Item OldValue NewValue 
1 INT115 25   2875 
1 INT430 75   32250 
1 INT550 18   9900 
2 INT115 10   1150 
2 INT430 1   430 
2 INT550 22   12100 
1

這裏有一個方法從你的列名解析乘數值:

SELECT RIGHT(name, LEN(name) - PATINDEX('%[0-9]%', name) + 1) 
FROM sys.columns 
WHERE object_id = OBJECT_ID('yourtablenamehere') 

我希望我知道更多,但我希望這一塊可以幫助!

2

這可能不是最好的方法,但它會提供所需的結果。

USE MASTER; 
CREATE TABLE table1 
(
INT115 int, 
INT430 int, 
INT1000 int 
) 

Insert into table1 values (1, 1, 1); 
Insert into table1 values (10, 10, 10); 

DECLARE @MyTable VARCHAR(100) = 'table1' 
DECLARE @cmd VARCHAR(MAX) 
DECLARE @COLS VARCHAR(MAX) = '' 


SELECT @COLS = @COLS + ', ' + COLUMN_NAME + '*' + STUFF(COLUMN_NAME, 1, 3, '') + ' AS '+ COLUMN_NAME 
FROM master.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @MyTable 

DECLARE @COLNAMES VARCHAR(MAX) = STUFF(@COLS, 1, 1, '') 

SET @cmd = 'SELECT '+ @COLNAMES+ ' FROM ' + @MyTable 
EXEC (@cmd) 

OUTPUT:

其中包含了一些數據
INT115 INT430 INT1000 
--------------------- 
115  430  1000 
1150 4300 10000