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'。*/
哪位大神告诉我这是怎么回事啊。。
解决方案 »
- 急,服务器硬盘控制器坏,恢复出来的sql2005数据库文件附加时出错!
- [] 符号在SQL中怎么转义
- 使用什么语句可以获得sql数据库某表中的最后一条数据
- ■■■看一个简单的问题,关键字:AND 'sp_password' = 'sp_password'■■■
- 问一个低级问题
- 心中的疑虑,进来提提意见
- 哪里有SQL2000英文版下载,给个网址.
- 请问各位,怎样在数据库里存储数组呢?
- 如何让SQL server 只传送一条记录到客户端,用户在客户端应用程序点击“下一条”后,再传送一条记录到客户端?
- sql2008 StorageDataReader+StorageAbortedException
- dbo用户登录名的问题,没有登录名是个什么状况?
- 一个十分简单的存储过程,请大家帮看看问题在那里。多谢!
你这里面的其它变量 呢,哪定义去了?
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'。
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把这个看懂了问题就基本解决了
set @name='a'exec('select * from tb where name='''+@name+'''')简单的例子
输入或输出参数 (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)
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自己声明和赋值