Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从所有表格复制,插入所有表格(sp_MSforeachtable备选方案)_Sql_Sql Server_Sp Msforeachtable - Fatal编程技术网

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