2017-08-04 52 views
0
create table T1 
(
    Name varchar(50), 
    Address varchar(50), 
    Tel varchar(50) 
); 

create table T2 
(
    ParamName varchar(50), 
    ParamValue Varchar(60), 
    TableName varchar(50) 
); 

insert into T2 values('Name', 'test', 'Member'); 
insert into T2 values('Address', 'testAdd', 'Member'); 
insert into T2 values('Tel', 'test', 'Member'); 

insert into T1(Select distinct ParamName from T2) 
values(select ParamValue from T2) 

我正在寻找通过从T2 table.need获取值和列名来插入T1表的方法从T2表中获取列名,并将值赋予该特定列如何通过从另一个表中获取值和列名将值插入到SQL Server表中

+1

你能告诉我们什么是两个表之间的逻辑_relation_?这看起来对我来说可能是糟糕的设计。 –

+0

这看起来不像数据库的正确使用。看起来您正在使用表T2临时存储值,这些值彼此无关。列ParamValue migh保存一个名称,并在下一行保存电话号码。似乎不正确。您应该直接从数据源插入T1 –

+0

T1列名称= T2 ParmName这仅仅是样本表 插入到T1(从T2中选择不同的参数名称) 值(从T2中选择Para​​mValue) –

回答

-1
DECLARE @TableName varchar(50) = 'T1' 
DECLARE @ColumnName varchar(MAX) 
SELECT @ColumnName= coalesce(@ColumnName + ', ', '') + a.COLUMN_NAME 
from (SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    inner join T2 on TableName = TABLE_NAME 
    WHERE TABLE_NAME = @TableName and ParamName = COLUMN_NAME) a; 
print @ColumnName 

declare @ParamName varchar(MAX) 
SELECT @ParamName = coalesce(@ParamName + ', ', '') + ''''+a.ParamValue+'''' 
from (SELECT COLUMN_NAME,ParamValue 
    FROM INFORMATION_SCHEMA.COLUMNS 
    inner join T2 on TableName = TABLE_NAME 
    WHERE TABLE_NAME = @TableName and ParamName = COLUMN_NAME) a; 
print @ParamName 

declare @QUERY nvarchar(MAX); 
SET @QUERY = 'INSERT INTO T1 ('[email protected]+') 
      VALUES ('[email protected]+')' 

EXEC sp_executesql @QUERY 

这是我期待的答案,谢谢大家的帮助

1

您的表结构没有多大意义。表格之间没有明显的逻辑关系。第二个只是一个缓冲表?

在任何情况下,但是,如果要插入从表中的值到另一个表你那样做:

INSERT INTO [target_table] ([target_column_1], [target_column_2], ..., [target_column_n]) 
    SELECT [source_column_1], [source_column_2], ..., [source_column_n] 
     FROM [source_table] 
     WHERE [conditon] 
1

您可以使用此:

INSERT INTO T2(Column1,Column2) 
SELECT Column1, Column2 FROM T1 
GROUP BY Column1; 
0

我认为你是寻找像..

INSERT INTO T1(Name) 
SELECT DISTINCT ParamName FROM T2 
+0

之后,你希望T1保留什么样本ParamName是列名,Paramvalue是该列的值,我想从T2表中获得两个。有办法在t2表中获得 –

2

你可以尝试使用上T2枢轴查询来获取的名字,一个地址和电话号码放在每个表名的单个行上。然后,就像你一样做一个INSERT INTO ... SELECT,除了使用pivoted结果。

INSERT INTO T1 (Name, Address, Tel) 
SELECT 
    MAX(CASE WHEN ParamName = 'Name' THEN ParamValue END) AS Name, 
    MAX(CASE WHEN ParamName = 'Address' THEN ParamValue END) AS Address, 
    MAX(CASE WHEN ParamName = 'Tel'  THEN ParamValue END) AS Tel 
FROM T2 
GROUP BY TableName 
-- WHERE TableName IN ('Member', ...) 

,如果你想限制插入到特定的表名,您可以取消该WHERE条款。

作为一般性评论,如果你这样做是为了让你的数据进入更规范化的形式,那么我认为它是好的。但是,如果您计划长期存储数据,则可能需要重新考虑您的表格设计。

+0

ParamName是列的名称和Paramvalue是该列的值,我想从T2 table.are有办法做到这一点 –

+0

我的答案已经这样做。 –

相关问题