有以下代码在Ctrl+F5时老是提示‘必须声明标量变量@T’,麻烦帮看下到底是哪里错了declare @Sql nvarchar(500)
declare @SysOrderNo int
declare @ShortName varchar(30),@Spec varchar(30),@Spec1 varchar(30),@Spec2 varchar(30),@Spec3 varchar(30),@Spec4 varchar(30)
declare @DataBaseName varchar(30)
declare @T table (Row        int identity(1,1)    not null,
    ShortName varchar(30)        null,
    Spec    varchar(30)            null,
    Spec1    varchar(30)            null,
    Spec2    varchar(30)            null,
    Spec3    varchar(30)            null,
    Spec4    varchar(30)            null,
    primary key (Row)
)
Set @DataBaseName='FYData'
Set @SysOrderNo=5
Set @Sql='insert into @T Select ShortName,Spec,Spec1,Spec2,Spec3,Spec4 From '+@DataBaseName+'.dbo.ORDERDETAIL '+' Where SysOrderNo='+cast(@SysOrderNo as varchar(10))
exec sp_executesql @Sql,N'@ShortName varchar(30) output,@Spec varchar(30) output,@Spec1 varchar(30) output,@Spec2 varchar(30) output,@Spec3 varchar(30) output,@Spec4 varchar(30) output,@T table output',@ShortName output,@Spec output,@Spec1 output,@Spec2 output,@Spec3 output,@Spec4 output,@T output
Select * From @T
消息框里提示错出在exec那一句

解决方案 »

  1.   

    'insert into @T这里的 @T 系统会认为是一个 标量变量。 也就是说你的 语法是错误的。
    SP_EXECUTESQL 在这里是不支持 表变量的。
      

  2.   


    啊!sp_executesql不支持表变量输出啊?确定?
      

  3.   

    SP_EXECUTESQL 参数必须是unicode类型的
    可以把@T变量的定义到 @sql字符串里面
    然后用exec @sql ....
      

  4.   

    改成:Set @Sql='insert into @T table (Row        int identity(1,1)    not null,
        ShortName varchar(30)        null,
        Spec    varchar(30)            null,
        Spec1    varchar(30)            null,
        Spec2    varchar(30)            null,
        Spec3    varchar(30)            null,
        Spec4    varchar(30)            null,
        primary key (Row)
    ) Select ShortName....报错:关键字'table'附近有语法错误
      

  5.   

    try this,declare @Sql nvarchar(500)
    declare @SysOrderNo int
    declare @ShortName varchar(30),@Spec varchar(30),@Spec1 varchar(30),@Spec2 varchar(30),@Spec3 varchar(30),@Spec4 varchar(30)
    declare @DataBaseName varchar(30)
    declare @T table (Row        int identity(1,1)    not null,
        ShortName varchar(30)        null,
        Spec    varchar(30)            null,
        Spec1    varchar(30)            null,
        Spec2    varchar(30)            null,
        Spec3    varchar(30)            null,
        Spec4    varchar(30)            null,
        primary key (Row)
    )
    Set @DataBaseName='FYData'
    Set @SysOrderNo=5
    Set @Sql=N'Select ShortName,Spec,Spec1,Spec2,Spec3,Spec4 From ['+@DataBaseName+'].dbo.ORDERDETAIL Where SysOrderNo='''+cast(@SysOrderNo as varchar(10))+''' 'insert into @T exec sp_executesql @SqlSelect * From @T