Search code examples
sqlsql-server-2008stored-proceduresssms

Copy a Table's data from a Stored Procedure


I am learning how to use SQL and Stored Procedures. I know the syntax is incorrect:

Copy data from one table into another table on another Database with a Stored Procedure. The problem is I don't know what table or what database to copy to. I want it to use parameters and not specify the columns specifically.

I have 2 Databases (Master_db and Master_copy) and the same table structure on each DB.

I want to quickly select a table in Master_db and copy that table's data into Master_copy table with same name. I have come up with something like this:

USE Master_DB
CREATE PROCEDURE TransferData
DEFINE @tableFrom, @tableTo, @databaseTo;

INSERT INTO @databaseTo.dbo.@databaseTo
SELECT * FROM Master_DB.dbo.@tableFrom
GO;

The closest I could get was this. The problem now is that I have a Timestamp column and that rendered an error:

"Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column."

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

How can I go around this error with this SP?


Solution

  • Object names in SQL queries cannot be parameterised in the way you are attempting.

    To get this to work, you need to use dynamic 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;