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"。

解决方案 »

  1.   

    insert into @e_dbname.@e_name select * from @s_name
    红色标记部分没有赋值
      

  2.   

    好像表名不能直接用参数,你需要在内部组合一下,比如 设置参数 @tablename,然后存储过程中再设置
    set @table=' ['+@tablename+']',内部用@table做表名
      

  3.   

     insert into @e_dbname.@e_name
    select * from @s_name这样不行吧,你的数据库是传进来的参数你把上面这个通过 exec(@sql) 这样来执行试试@sql = “insert into “+@e_dbname+”.+“@e_name”
    我上面只是举个例子我感觉@e_dbname 只是一个字符串,编译器不可能知道它是一个数据库的名字 
      

  4.   

    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, ','))        --获取目标表名
                                            
    --------------这样------------------------------------------------------------------------------------
                    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