create proc ImportData
@e_dbname varchar(20), --目标数据库名称
@s_tnames varchar(100), --源表名(字符串,以','隔开)
@e_tnames varchar(100) --目标表名(字符串,以','隔开)
as
begin
begin transaction
declare @s_count int; --源表的个数
declare @e_count int; --目标表的个数
declare @count int; --基数
set @count=0
set @s_count= len(@s_tnames)-len(replace(@s_tnames,',',''))+1 --获取源表的个数
set @e_count= len(@e_tnames)-len(replace(@e_tnames,',',''))+1 --目标表的个数 if @s_count=@e_count --判断个数是否一样 declare @s_name varchar(20); --源表名
declare @e_name varchar(20); --目标表名
while @count<@s_count
begin
set @s_name=substring(@s_tnames,0,charindex(@s_tnames,',')) --获取源表名
set @e_name=substring(@e_tnames,0,charindex(@e_tnames,',')) --获取目标表名 insert into @e_dbname.@e_name
select * from @s_name
set @count=@count+1
set @s_tnames=substring(@s_tnames,0,charindex(@s_tnames,',')+1)
set @e_tnames=substring(@e_tnames,0,charindex(@e_tnames,',')+1)
end
if @@error <>0
Begin
RollBack Tran
End
Else
Begin
Commit Tran
End
end
在insert into @e_dbname.@e_name select * from @s_name处报第 24 行'.' 附近有语法错误。
必须声明表变量 "@s_name"。
@e_dbname varchar(20), --目标数据库名称
@s_tnames varchar(100), --源表名(字符串,以','隔开)
@e_tnames varchar(100) --目标表名(字符串,以','隔开)
as
begin
begin transaction
declare @s_count int; --源表的个数
declare @e_count int; --目标表的个数
declare @count int; --基数
set @count=0
set @s_count= len(@s_tnames)-len(replace(@s_tnames,',',''))+1 --获取源表的个数
set @e_count= len(@e_tnames)-len(replace(@e_tnames,',',''))+1 --目标表的个数 if @s_count=@e_count --判断个数是否一样 declare @s_name varchar(20); --源表名
declare @e_name varchar(20); --目标表名
while @count<@s_count
begin
set @s_name=substring(@s_tnames,0,charindex(@s_tnames,',')) --获取源表名
set @e_name=substring(@e_tnames,0,charindex(@e_tnames,',')) --获取目标表名 insert into @e_dbname.@e_name
select * from @s_name
set @count=@count+1
set @s_tnames=substring(@s_tnames,0,charindex(@s_tnames,',')+1)
set @e_tnames=substring(@e_tnames,0,charindex(@e_tnames,',')+1)
end
if @@error <>0
Begin
RollBack Tran
End
Else
Begin
Commit Tran
End
end
在insert into @e_dbname.@e_name select * from @s_name处报第 24 行'.' 附近有语法错误。
必须声明表变量 "@s_name"。
红色标记部分没有赋值
set @table=' ['+@tablename+']',内部用@table做表名
select * from @s_name这样不行吧,你的数据库是传进来的参数你把上面这个通过 exec(@sql) 这样来执行试试@sql = “insert into “+@e_dbname+”.+“@e_name”
我上面只是举个例子我感觉@e_dbname 只是一个字符串,编译器不可能知道它是一个数据库的名字
@e_dbname VARCHAR(20) , --目标数据库名称
@s_tnames VARCHAR(100) , --源表名(字符串,以','隔开)
@e_tnames VARCHAR(100) --目标表名(字符串,以','隔开)
AS
BEGIN
BEGIN TRANSACTION
DECLARE @s_count INT ; --源表的个数
DECLARE @e_count INT ; --目标表的个数
DECLARE @count INT ; --基数
SET @count = 0
SET @s_count = LEN(@s_tnames) - LEN(REPLACE(@s_tnames, ',', '')) + 1 --获取源表的个数
SET @e_count = LEN(@e_tnames) - LEN(REPLACE(@e_tnames, ',', '')) + 1 --目标表的个数
IF @s_count = @e_count --判断个数是否一样
DECLARE @s_name VARCHAR(20) ; --源表名
DECLARE @e_name VARCHAR(20) ; --目标表名
WHILE @count < @s_count
BEGIN
SET @s_name = SUBSTRING(@s_tnames, 0,
CHARINDEX(@s_tnames, ',')) --获取源表名
SET @e_name = SUBSTRING(@e_tnames, 0,
CHARINDEX(@e_tnames, ',')) --获取目标表名
--------------这样------------------------------------------------------------------------------------
EXEC ('insert into '+@e_dbname+'.'+@e_name+' select * from '+ @s_name)
--PRINT 'insert into '+@e_dbname+'.'+@e_name+' select * from '+ @s_name
SET @count = @count + 1
SET @s_tnames = SUBSTRING(@s_tnames, 0,
CHARINDEX(@s_tnames, ',') + 1)
SET @e_tnames = SUBSTRING(@e_tnames, 0,
CHARINDEX(@e_tnames, ',') + 1)
END
IF @@error <> 0
BEGIN
ROLLBACK TRAN
END
ELSE
BEGIN
COMMIT TRAN
END
END