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_cols
是PL\Sql
函数,你不能在sql server
中使用它
是的,你是对的。为 sql server 编辑了我的帖子。我错过了标签。以上是关于SQL:插入语句,但假设您不知道源头和目标头的主要内容,如果未能解决你的问题,请参考以下文章