一张表,里面只有两列,分别是Id,name.id自动增长。我想通过储存过程把表名和和属性都用参数传递。但是执行报了
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 10
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'. 

希望哪位大哥帮忙解决。小弟感激万分!
主要遇到就是不能把表名当参数传递。
以下是小弟测试的代码
create procedure tests
@name varchar(20),
@tableName varchar(50) --表名--
as
begin
declare @ta varchar(25);
declare @Sql varchar(150);
set @ta=@name;
set @Sql='insert into '+@tableName+'(name)values('+(@ta)+')'
exec sp_executesql @Sql
end

解决方案 »

  1.   

    @statement這個東東的類型是啥樣地
      

  2.   

    你把执行的sql打出来看看select @Sql;
      

  3.   

    将 declare @Sql varchar(150); 改为
       declare @Sql nvarchar(150);在存储过程中拼接SQL时,SQL字符串要用 nvarchar 类型
      

  4.   

    create procedure tests
    @name varchar(20),
    @tableName varchar(50)
    as
    begin
       declare @sql nvarchar(max)
       set @sql='insert into ' + @tableName + '(name) values (' + @name +')'
       exec(@sql)
    end
      

  5.   

    我是直接在SqlServer2005里面测试的。传属性添加可以,但是我现在的项目遇到的是要动态该表表名的,所以要把表名也当参数传递。但是用表名传递的时候就出这样的问题了。要不就是说数据转换溢出。
      

  6.   

    最后执行那句改成
    exec sp_executesql @Sql N'@name varchar(25),@tableName varchar(100)',@name ,@tableName  
      

  7.   


    乱说,谁说拼接Sql不能用varchar了
    如下例子 你去sql2005中测试
    create proc TestPoc
    @tablename varchar(50)
    as
    begin
    declare @sql varchar(100)
    set @sql='select * from '+@tablename
    exec(@sql)
    end
      

  8.   

    ALTER procedure tests
    @name Nvarchar(20),
    @tableName Nvarchar(50) --表名--
    as
    begin
    declare @ta Nvarchar(25);
    declare @Sql Nvarchar(150);
    set @ta=@name;
    set @Sql='insert into '+@tableName+'(name)values('+(@ta)+')'
    exec sp_executesql @Sql
    end
    传递para的时候给定第三个长度的那个参数
      

  9.   

    老弟执行报了这个错误
    Msg 128, Level 15, State 1, Line 1
    The name 'da' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted.(1 row(s) affected)
      

  10.   

    create procedure tests
    @name varchar(20),
    @tableName varchar(50) --表名--
    as
    BEGIN
    ----------DECLARE @tableName NVARCHAR(20)
    declare @ta varchar(25);
    declare @Sql varchar(150);------set @tableName='aaaa';
    ----set @ta='aaaa';set @Sql='insert into '+@tableName+' (name)values(N'''+(@ta)+''')'
    ----PRINT  @Sql
    exec sp_executesql @Sqlend
      

  11.   

    楼主的例子我拿来在2005中测试过了,没问题
    小小问题改一下
    set @Sql='insert into '+@tableName+'(name) values('+(@ta)+')'
    values前面加空格
      

  12.   

    create procedure tests
    @name varchar(20),
    @tableName varchar(50) --表名--
    as
    BEGIN
    ----------DECLARE @tableName NVARCHAR(20)
    declare @ta varchar(25);
    declare @Sql varchar(150);------set @tableName='aaaa';
    ----set @ta='aaaa';set @Sql='insert into '+@tableName+' (name)values('''+(@ta)+''')'
    PRINT  @Sql
    ---exec sp_executesql @Sqlend
    看看输出的SQL是否正确的。
      

  13.   


    create procedure tests
    @name varchar(20),
    @tableName varchar(50) --表名--
    as
    begin
    declare @Sql nvarchar(150);
    print '@name='+@name
    print '@tableName='+@tableName
    set @Sql='insert into '+@tableName+'(name) values('''+@name+''')'
    print @sql
    exec sp_executesql @Sql
    end
      

  14.   

    exec tests 'aaa','tba'
    刚试 了下,
    表只能了两个字段一个ID自增长一个NAME VARCHAR(50)
    没问题.
      

  15.   

    alter procedure tests
    @name varchar(20),
    @tableName varchar(50) --表名--
    as
    BEGIN
    ----------DECLARE @tableName NVARCHAR(20)
    declare @ta varchar(25);
    declare @Sql varchar(150);
    set @ta=@name;
    ------set @tableName='aaaa';
    ----set @ta='aaaa';
    set @Sql='insert into '+@tableName+' (name)values('''+(@ta)+''')'
    exec(@Sql)
    ---exec sp_executesql @Sql
    end
    这样在2005的数据库正常,但是在2000的数据就报错了。希望大家帮忙找找原因。谢谢