SQL:插入语句,但假设您不知道源头和目标头

Posted

技术标签:

【中文标题】SQL:插入语句,但假设您不知道源头和目标头【英文标题】:SQL: Insert into statement, but suppose you do not know origin and target headers 【发布时间】:2011-10-14 05:18:27 【问题描述】:

我正在尝试提出一个插入 sql 语句,它将数据从一个表插入到另一个现有表中。实际上有一些方法可以做到这一点,但我没有找到符合我要求的方法。

我需要一个插入语句类型的查询,它将数据插入另一个表,但它不知道两个表都有哪些标题。例如,源表有 25 个标题,目标表有 20 个,其中 10 个在名称上匹配。我想转移与标题名称匹配的那些忽略其余部分。

希望我很清楚,希望任何人都能够帮助我

【问题讨论】:

“标题”是指“列”? 我认为这不可能。 您需要它来查询,还是 SSIS 工作? 是的,很抱歉,专栏。最好查询将不得不做 数据类型不匹配怎么办? 【参考方案1】:

我认为您必须获取两个表列然后过滤 em 以获取匹配列名称,然后您可以构建您的 insert into 语句并执行它

获取两个表中都存在的列

Declare @cols varchar(max)

SELECT  @cols =COALESCE(@cols +',','')+'['+COLUMN_NAME+']'
FROM DbName.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'security' and COLUMN_NAME in( 
      SELECT COLUMN_NAME
      FROM DbName.INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = N'debt_securities')

然后创建插入语句

declare @query varchar(max)='insert into debt_securities('+@cols+')
                             select '+@cols+' from [security]'

然后执行它

exec(@query)

【讨论】:

非常感谢您的回复。但由于某种原因,我无法工作。有问题的两个表是:security(来源)和debt_securities(目标) 显然这是对快速问题的快速回答,但最好使用 QuoteName() 处理包含空格等的列名。 @Tao 感谢您的注释,我编辑了它,但我使用了括号而不是QuoteName() 我会按照@tao 的建议使用quotename,否则您将无法处理有效的“foo[]bar”列,引用[foo[]]bar]【参考方案2】:

我想不出一个查询可以做到这一切,但你绝对可以编写一个 sql server 过程来做到这一点。

您可以从以下查询中获取源表和目标表的列名和列的数据类型列表

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TABLENAME'

有了这个,你可以在 pl/sql 中运行一个循环来根据名称和数据类型找出匹配的列,然后形成一个动态的动态 plsql 并执行它。我猜这应该可以解决你的目的。

【讨论】:

我认为 pl/sql 适用于 oracle,不是吗?他用sql-server标记了这个问题 是的,我的评论更倾向于 oracle,我想在 sqlserver 或任何其他数据库中应该是相似的 不,不是,all_tab_colsPL\Sql 函数,你不能在sql server 中使用它 是的,你是对的。为 sql server 编辑了我的帖子。我错过了标签。

以上是关于SQL:插入语句,但假设您不知道源头和目标头的主要内容,如果未能解决你的问题,请参考以下文章

在 sql 查询期间获取 Id 并用于另一个插入语句

PL/SQL 在插入语句的子查询中使用别名和函数

为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

sql语句 怎么从一张表中查询数据插入到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中

SQL - 查找插入特定值的语句