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?
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;