Sql 从所有表格复制,插入所有表格(sp_MSforeachtable备选方案)
我决定分享我的经验,尝试将所有表中的数据复制到不同模式中的同名表中。我相信我的经验可以帮助其他人在不使用不受支持且明显受限的Sql 从所有表格复制,插入所有表格(sp_MSforeachtable备选方案),sql,sql-server,sp-msforeachtable,Sql,Sql Server,Sp Msforeachtable,我决定分享我的经验,尝试将所有表中的数据复制到不同模式中的同名表中。我相信我的经验可以帮助其他人在不使用不受支持且明显受限的spmsforeachtable的情况下寻求海量表操作 目标:将数据库中所有表中的数据复制到具有不同架构的同名表中 关于sp\MSforeachtable的一个简要说明。大多数情况下,当人们在这里询问有关此存储过程的问题时,总会有人回答说我们不应该使用不受支持的功能。这根本不是真的,我们不应该基于不受支持的特性进行实践和设计决策,主要是因为它们可能会消失。 但是在某个特定的
spmsforeachtable
的情况下寻求海量表操作
目标:将数据库中所有表中的数据复制到具有不同架构的同名表中
关于sp\MSforeachtable
的一个简要说明。大多数情况下,当人们在这里询问有关此存储过程的问题时,总会有人回答说我们不应该使用不受支持的功能。这根本不是真的,我们不应该基于不受支持的特性进行实践和设计决策,主要是因为它们可能会消失。
但是在某个特定的时间点,如果一个不受支持的特征存在,并且确实做了我们需要做的事情,即一次性的风格,那么就只需考虑自己的幸运,并尽可能地使用它,就要小心那些意外的行为。当使用这些特性时,最好坚持使用简单的操作,这些操作的输出是快速且容易验证的
话虽如此,同时也因为
spmsforeachtable
存在一些实际的限制,我提出了一种针对所有(或特定)语句执行语句的不同但不太复杂的方法数据库中的表,我以我的问题为例。我通常通过生成返回语句的查询来解决这个问题,然后将这些语句复制粘贴到新的查询窗口并执行它们。我喜欢这种方法,因为我可以在语句执行之前看到它们,还可以使用解析器快速识别它们的问题。考虑到这一点,我的问题是:
SELECT DISTINCT ''
+ ' INSERT INTO ' + 'dbo.' + QUOTENAME(name)
+ ' (' + dbo.COLUMN_NAMES('dbo', name) + ')'
+ ' SELECT ' + dbo.COLUMN_NAMES('dbo', name)
+ ' FROM ' + 'db_owner.' + QUOTENAME(name)
FROM sys.tables
-- add your own WHERE clauses to only execute against specific tables
就这么简单。这将返回插入到…的列表。。。从…中选择。。。我可以简单地将这些语句复制粘贴到新的查询窗口中
如果您想知道为什么不只是使用SELECT*,那很简单,因为如果您的表有ID列,那么您需要显式地命名这些列,并在前后添加SET_IDENTITY语句
COLUMN_NAMES函数是一个非常自解释的函数,它为指定的表返回逗号分隔的列名:
CREATE FUNCTION COLUMN_NAMES
(
@tableschema VARCHAR(MAX),
@tablename VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN (
REPLACE(
(SELECT QUOTENAME(COLUMN_NAME) AS 'data()'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA=@tableschema AND TABLE_NAME=@tablename ORDER BY ORDINAL_POSITION FOR XML PATH('')),
' ',', '))
END
GO