CREATE               PROCEDURE               addtable       
  (@name         nvarchar(64)   ,                             --是一个要组成新表名的名称       
  @guid         uniqueidentifier,   
  @nguid           uniqueidentifier,         --表中的字段 
  @ID               nvarchar(64), 
  @data           xml

                                                          
  declare   @n   int 
  declare   @m   int 
declare @a nvarchar(1000),@b nvarchar(1000)
  declare   @tablename   nvarchar(200) 
  set   @tablename=( 'table '+@name)--关键是表的名称   要声明表变量     要是能声明是最好不过了 
  set   @n=0 
  set   @m=0 
  set   @a='select   @n=count(*)   from   '+@tablename+'     where   guid=''' +@guid+''''
  set   @b='select   @m=count(*)   from   '+@tablename+'     where     nguid=@nguid   and   id=' +rtrim(@id)exec sp_executesql @a,N'@n int output',@n output exec sp_executesql @b,N'@m int output',@n output
   
  if   @n=0   or   @m=0 
   exec 'insert   into   '+@tablename+'   
      (guid,nguid,id,data,)   values   ('''+@guid+''','''+@ngui+''','+rtrim(@id)+','''+@data+''')') 
  if   @n!=0   or   @m!=0 
    begin 
        raiserror( 'the   data   exis ',16,1) 
    end   

解决方案 »

  1.   

    用字符串拼揍,用executesql变量传参:
     exec sp_executesql @b,N'@m int output',@m output--改一下这里@m
      

  2.   

    动态语法如下:
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
    --------------------------------------------------------------------------------动态sql语句基本语法 
    1 :普通SQL语句可以用Exec执行 eg:   Select * from tableName 
             Exec('select * from tableName') 
             Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:   
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功 
    exec sp_executesql @s   -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功     
    exec sp_executesql @s   -- 此句正确 3. 输出参数 
    declare @num int, 
            @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
      

  3.   


    set   @n=(select   count(*)   from   @tablename     where   guid=@guid) 
    set   @m=(select   count(*)   from   @tablename     where     nguid=@nguid   and   id=@id) 这两句改成
    declare @sql nvarchar(4000)
    set @sql='select @n=count(*) from '+@tablename+' where guid='''+ltrim(@guid)+''';select 
     @m=count(*) from '+@tablename+' where nguid='''+ltrim(@nguid)+''' and id='''+@id+''''
    exec sp_executesql @sql,N'@n int output,@m int output',@n output,@m output
        
      

  4.   

    @data 是一个xml 类型的  它不允许从xml到nvarchar的隐士转换  在一个不用考虑字符串的长度吗?最长4000  我的一个xml类型的传进来的参数不止4000
      

  5.   

    消息 257,级别 16,状态 3,过程 addtable2,第 24 行
    不允许从数据类型 xml 到 nvarchar 的隐式转换。请使用 CONVERT 函数来运行此查询。