2016-09-22 2 views
0

У меня есть таблица SQL Server с именами столбцов, такими как INT115, INT430 и т. Д. С их соответствующими данными. Я хочу умножить данные в столбце INT115 с 115, данными в столбце INT430 с 430 и так далее. Я не уверен, как действовать дальше.SQL извлекает информацию из имен колонок

Редактировать: Мне нужно разобрать имена столбцов и избавиться от оставшихся трех символов, чтобы найти номер множителя.

Edit2: Я работаю с grandfathered table, поэтому я не могу вносить изменения в структуру базы данных.

+3

имена столбцов которых содержит некоторые данные - не хороший подход. Приложение A: у вас уже есть проблемы для продолжения работы. – Fabio

+2

Для этого может потребоваться динамический SQL. –

+1

Вы должны прочитать нормализацию базы данных. –

ответ

1

Edit после вопроса был обновлен

Это не требует какой-либо жесткое кодирование на всех: Вы можете курсор через временную таблицу, которая разобранная по именам столбцов, чтобы получить значение умножения, а затем выбрать из таблицы и которые даст вам умноженные значения. Я использую «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 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) 

ВЫВОД:

INT115 INT430 INT1000 
--------------------- 
115  430  1000 
1150 4300 10000 
Смежные вопросы