declare @SKI INT,@SKIS VARCHAR(1),@SQL VARCHAR(8000),
@A1 INT,@B1 INT,@A DATETIME,@B DATETIME,@SKSJ DATETIME,
@SJ1 DATETIME,@SJ2 DATETIME,@SJ3 DATETIME,@SJ4 DATETIME
SET @SKI=1While @SKI <= 4
BEGIN
SET @SKIS = CONVERT(VARCHAR(1),@SKI)
SET  @SQL = 'SELECT @SKSJ=SJ' + @SKIS + ',@A1=SJ' + @SKIS + 'A,@B1=SJ' + @SKIS + 'B FROM WORKTIME WHERE TIMEID=@BC'
EXEC (@SQL) SET @A = DATEADD(MINUTE,-@A1,@SKSJ)
SET @B = DATEADD(MINUTE, @B1,@SKSJ)

SET  @SQL = 'SELECT @SJ' + @SKIS + '=SJ FROM YSKQ WHERE BH=@BH AND RQ=@RQ AND SJ BETWEEN @A AND @B'
EXEC (@SQL)

SET @SKI = @SKI + 1
END
/* 报错
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SKSJ'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SJ1'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SKSJ'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SJ2'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SKSJ'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SJ3'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SKSJ'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@SJ4'。*/
哪位大神告诉我这是怎么回事啊。。

解决方案 »

  1.   

    SET  @SQL = 'SELECT @SJ' + @SKIS + '=SJ FROM YSKQ WHERE BH=@BH AND RQ=@RQ AND SJ BETWEEN @A AND @B'
    你这里面的其它变量 呢,哪定义去了?
      

  2.   

    SET @SQL = 'SELECT @SJ' + @SKIS + '=SJ FROM YSKQ WHERE BH='+LTRIM(@BH)+' AND RQ='''+LTRIM(@RQ)+''' AND SJ BETWEEN @A AND @B'PRINT @SQL最好先PRINT 出来
      

  3.   

    我晕,后面又忘打了SET @SQL = 'SELECT @SJ' + @SKIS + '=SJ FROM YSKQ WHERE BH='+LTRIM(@BH)+' AND RQ='''+LTRIM(@RQ)+''' AND SJ BETWEEN '''+LTRIM(@A)+''' AND '''+LTRIM(@B)+''''PRINT @SQL都要转成字符型来连接,如果BH是字符型,再加两点
      

  4.   

    少定义了一个@BC VARCHAR(2)
    SELECT @SKSJ=SJ1,@A1=SJ1A,@B1=SJ1B FROM WORKTIME WHERE TIMEID=@BC
    SELECT @SJ1=SJ FROM YSKQ WHERE BH=@BH AND RQ=@RQ AND SJ BETWEEN @A AND @B这是print出来的结果。这是继续报错的结果:
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SKSJ'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SJ1'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SKSJ'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SJ2'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SKSJ'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SJ3'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SKSJ'。
    服务器: 消息 137,级别 15,状态 1,行 1
    必须声明变量 '@SJ4'。
      

  5.   

    @SKSJ,@SJ1,@SJ2,@SJ3,@SJ4明明定义了啊。
      

  6.   

    --用sp_executesql
    declare @i int,@con int,@s nvarchar(1000)
    set @i=5
    select @s='select @con=count(1) from sysobjects where ID>@i'
    exec sp_executesql @s,N'@con int output,@i int',@con output ,@i 
    select @con把这个看懂了问题就基本解决了
      

  7.   

    declare @name varchar(20)
    set @name='a'exec('select * from tb where name='''+@name+'''')简单的例子
      

  8.   

    SET  @SQL = 'SELECT @SKSJ=SJ' + @SKIS + ',@A1=SJ' + @SKIS + 'A,@B1=SJ' + @SKIS + 'B FROM WORKTIME WHERE TIMEID=@BC'  应该是执行这句的好似好出错的 exec时候执行的是 @SQL  这句 里面 没有定义那些变量吧 
      

  9.   

    看看这个 很明白了:
    输入或输出参数      (1)输入参数:
              declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
              declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
              declare @input_id int--定义需传入动态语句的参数的值          set @QueryString='select * from tablename  where id=@id'  --id为字段名,@id为要传入的参数
              set @paramstring='@id int' --设置动态语句中参数的定义的字符串
              set @input_id =1  --设置需传入动态语句的参数的值为1
              exec sp_executesql @querystring,@paramstring,@id=@input_id  
              若有多个参数:
              declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
              declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
              declare @input_id int--定义需传入动态语句的参数的值,参数1
              declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2          set @QueryString='select * from tablename  where id=@id and name=@name'   --id与name为字段名,@id与@name为要传入的参数
              set @paramstring='@id int,@name varchar(20)' --设置动态语句中参数的定义的字符串,多个参数用","隔开
              set @input_id =1  --设置需传入动态语句的参数的值为1
              set @input_name='张三'   --设置需传入动态语句的参数的值为"张三"
              exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --请注意参数的顺序
         (2)输出参数
                declare @num int, @sqls nvarchar(4000) 
                set @sqls='select count(*) from tableName' 
                exec(@sqls) 
            --如何将exec执行结果放入变量中?          
            declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
            declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
            declare @output_result int--查询结果赋给@output_result         set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 为输出结果参数
            set @paramstring='@totalcount int output' --设置动态语句中参数的定义的字符串,多个参数用","隔开
            exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
            select @output_result
            当然,输入与输出参数可以一起使用,大家可以自己去试一试。
            另外,动态语句查询的结果集要输出的话,我只想到以下用临时表的方法,不知各位有没有更好的方法.
            IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除
                drop table #tmp
            select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同        declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
            set @QueryString='select * from tablename '
            insert into #tmp(field1,field2,...) exec(@querystirng) 
      

  10.   

    declare @declare varchar(1000),@SQL VARCHAR(8000),@SKI INT,@SKIS VARCHAR(1)
    set @declare ='
    declare 
        @A1 INT,@B1 INT,@A DATETIME,@B DATETIME,@SKSJ DATETIME,@BC VARCHAR(2),
        @SJ1 DATETIME,@SJ2 DATETIME,@SJ3 DATETIME,@SJ4 DATETIME;'
    SET @SKI=1While @SKI <= 4
    BEGIN
        SET @SKIS = CONVERT(VARCHAR(1),@SKI)
        SET  @SQL =@declare+ 'SELECT @SKSJ=SJ' + @SKIS + ',@A1=SJ' + @SKIS + 'A,@B1=SJ' + @SKIS + 'B FROM WORKTIME WHERE TIMEID=@BC;
        SET @A = DATEADD(MINUTE,-@A1,@SKSJ);
        SET @B = DATEADD(MINUTE, @B1,@SKSJ);
        SELECT @SJ' + @SKIS + '=SJ FROM YSKQ WHERE BH=@BH AND RQ=@RQ AND SJ BETWEEN @A AND @B'
        EXEC (@SQL)
        
        SET @SKI = @SKI + 1
    END--@BH,@RQ自己声明和赋值
      

  11.   

    据77哥跟F姐姐指点  这种情况要用sp_executesql