我有一個列名稱的SQL Server表,如INT115
,INT430
等及其相應的數據。我想將INT115列中的數據乘以115,將INT430列中的數據乘以430,等等。我不知道如何繼續。SQL從列名稱提取信息
編輯:我需要解析列名,並擺脫左3個字符來提出乘數。
Edit2:我正在使用grandfathered表,所以我無法更改數據庫的外觀。問題後
我有一個列名稱的SQL Server表,如INT115
,INT430
等及其相應的數據。我想將INT115列中的數據乘以115,將INT430列中的數據乘以430,等等。我不知道如何繼續。SQL從列名稱提取信息
編輯:我需要解析列名,並擺脫左3個字符來提出乘數。
Edit2:我正在使用grandfathered表,所以我無法更改數據庫的外觀。問題後
編輯進行了更新
這不需要任何硬編碼在所有: 你可以光標來,通過列名解析,以獲得乘積值一個臨時表,然後從你的表和選擇會給你乘以價值。我使用'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
您可以如以下運行一個簡單的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.
希望這會有所幫助。
不知道所期望的結果應該是什麼樣子,但如果你不希望所有字段名代碼,這或許可以幫助
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
這裏有一個方法從你的列名解析乘數值:
SELECT RIGHT(name, LEN(name) - PATINDEX('%[0-9]%', name) + 1)
FROM sys.columns
WHERE object_id = OBJECT_ID('yourtablenamehere')
我希望我知道更多,但我希望這一塊可以幫助!
這可能不是最好的方法,但它會提供所需的結果。
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
列名 - 不是一個好方法。附件A:您已經有問題繼續工作 – Fabio
您可能需要使用動態SQL才能執行此操作。 –
你應該閱讀數據庫規範化。 –