我正在学习如何使用SQL和存储过程。我知道语法不正确:
使用存储过程将数据从一个表复制到另一个数据库上的另一个表中。问题是,我不知道要复制到哪个表或哪个数据库。我希望它使用参数,而不是具体指定列。
我在每个DB上有两个数据库(Master_db和Master_copy)和相同的表结构。
我希望在Master_db中快速选择一个表,并将该表的数据复制到同名的Master_copy表中。我想出了这样的点子:
USE Master_DB
CREATE PROCEDURE TransferData
DEFINE @tableFrom, @tableTo, @databaseTo;
INSERT INTO @databaseTo.dbo.@databaseTo
SELECT * FROM Master_DB.dbo.@tableFrom
GO;我能得到的最接近的就是这个。现在的问题是,我有一个时间戳列,并出现了一个错误:
“无法将显式值插入时间戳列。请使用”插入“与”列“列表一起排除时间戳列,或在时间戳列中插入默认值。”
USE Kenneth_Integration
GO
CREATE PROCEDURE TransferData
  @table  SYSNAME
  ,@databaseTo SYSNAME
AS
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'DELETE FROM ' + @databaseTo + '..' + @table + ' set identity_insert ' + @databaseTo + '.dbo.' + @table + 
    ' on INSERT INTO ' + @databaseTo + '.dbo.' + @table + ' SELECT * FROM Kenneth_Integration.dbo.' + @table
EXEC sp_executesql @sql
GO如何使用这个SP来避免这个错误?
发布于 2010-04-23 08:48:01
SQL查询中的对象名称不能以尝试的方式进行参数化。
要使它正常工作,您需要使用动态SQL:
USE Master_DB
CREATE PROCEDURE TransferData
 @tableFrom   SYSNAME
 ,@tableTo    SYSNAME
 ,@databaseTo SYSNAME
AS
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO ' + @databaseTo+ '.dbo.' + @tableTo + '
            SELECT * FROM Master_DB.dbo.' + @tableFrom
EXEC sp_executesql @sql
GO;发布于 2010-04-23 08:43:13
我的建议是编写返回表的函数,而不是使用insert select语句
与不能编写select procedure的过程和函数之间的区别,但可以编写选择函数
发布于 2010-04-23 08:48:34
只有动态SQL允许变量作为表名。对于examp0le:
create procedure dbo.TransferData(
    @src varchar(50),
    @dest varchar(50))
as
declare @query varchar(500)
set @query = 'INSERT INTO ' + @src +
    'SELECT * FROM ' + @dest
exec @query
gohttps://stackoverflow.com/questions/2697191
复制相似问题