Sqlserver存储过程如何写循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlserver存储过程如何写循环相关的知识,希望对你有一定的参考价值。

参考技术A declare @i int

set @i = 0

while @i < 100

begin

print @i

set @i = @i + 1

end

-- 定义循环变量

declare @loopIndex int set @loopIndex = 0

--定义循环次数

declare @count int set @count=1

-- 取得循环次数

select @count=count(1) from sys_user

-- 开始循环

while @loopIndex <= @count

begin

  -- 定义接收参数

  declare @USER_NAME nvarchar(50)

-- 取得循环的数据

SELECT @USER_NAME = hh.USER_NAME

FROM (SELECT ROW_NUMBER() OVER (ORDER BY USER_NAME) 'rowindex',USER_NAME FROM sys_user)hh 

WHERE hh.rowindex = @loopIndex

-- 进行相关业务逻辑 例如输出结果 

print @USER_NAME

-- 循环自动加一

set @loopIndex = @loopIndex + 1

end

begin

  -- 定义错误返回信息

  declare @error int 

-- 定义接收参数

  declare @User_Name varchar(50)

  declare @Address varchar(50)

  set @error=0

  --定义游标

  declare demo_cursor cursor

  for (select User_Name,Address from sys_user)

  --打开游标--

  open demo_cursor

  --开始循环游标变量--

  fetch next from demo_cursor into @User_Name,@Address

  while @@FETCH_STATUS = 0  --返回被 FETCH语句执行的最后游标的状态--

    begin       

      print @User_Name+'____'+@Address

      set @error= @error + @@ERROR  --记录每次运行sql后是否正确,0正确

      fetch next from demo_cursor into @User_Name,@Address  --转到下一个游标,没有会死循环

    end  

  close demo_cursor --关闭游标

  deallocate demo_cursor  --释放游标

end

更多内容请访问: https://mxdqh.top/

我写了一段存储过程 是SQLSERVER的代码如下:

ALTER PROCEDURE Page
AS
BEGIN
SET NOCOUNT ON;
--------------------------------变量声明部分------------------------------------------
DECLARE @Page INT
DECLARE @Count INT
DECLARE @VOL_ID VARCHAR(20)
DECLARE @VOLTAB VARCHAR(20)
DECLARE @SUBSTR1 VARCHAR(15)
DECLARE @SUBSTR2 VARCHAR(15)
DECLARE @SQL VARCHAR(100)
DECLARE @SQL1 VARCHAR(100)
DECLARE @STR VARCHAR(100)
DECLARE C_VOLTAB CURSOR FOR
SELECT DB_ENG FROM JKTABLE WHERE DB_TYPE = 3
---------------------------------------------------------------------------------------
OPEN C_VOLTAB
FETCH NEXT FROM C_VOLTAB INTO @VOLTAB
WHILE @@fetch_status = 0
BEGIN
--PRINT @VOLTAB

IF LEN(@VOLTAB) > 5
BEGIN
SET @SUBSTR1 = SUBSTRING(@VOLTAB,1,10)
SET @SUBSTR2 = SUBSTRING(@VOLTAB,1,9) + 'file' + SUBSTRING(@VOLTAB,10,11)
END
ELSE
BEGIN
SET @SUBSTR1 = SUBSTRING(@VOLTAB,1,5)
SET @SUBSTR2 = SUBSTRING(@VOLTAB,1,3) + 'file' + SUBSTRING(@VOLTAB,4,6)
END

PRINT @SUBSTR1
PRINT @SUBSTR2

SET @STR = 'DECLARE C_VOL CURSOR FOR SELECT vol_id FROM ' + @SUBSTR1

EXEC(@STR)

OPEN C_VOL
FETCH NEXT FROM C_VOL INTO @VOL_ID
WHILE @@fetch_status = 0
BEGIN

SET @SQL = N'SELECT @Page = sum(page), @Count = Count(*) FROM ' + @SUBSTR2 + 'WHERE vol_id = ' + @VOL_ID
EXEC sp_executesql @SQL,N'@Page AS INT OUTPUT,@Count AS INT OUTPUT', @Page OUTPUT, @Count OUTPUT,@VOL_ID
SELECT @Page
SELECT @Count

SET @SQL1 = 'UPDATE ' + @SUBSTR1 + N' SET page = @Page, copy = @Count WHERE vol_id = @VOL_ID'
EXECUTE sp_executesql @SQL1,N'@Page AS INT ,@Count AS INT', @Page , @Count

FETCH NEXT FROM C_VOL INTO @VOL_ID
END
CLOSE C_VOL
DEALLOCATE C_VOL

FETCH NEXT FROM C_VOLTAB INTO @VOLTAB
END
CLOSE C_VOLTAB
DEALLOCATE C_VOLTAB
END

EXEC Page

现在这段代码报错:内容如下
消息 214,级别 16,状态 2,过程 sp_executesql,第 1 行
过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'。
求教各位大大们怎么解答 小弟不胜感激 急活 在线等

create proc sp_InsertPhoto2
(
@name VARCHAR(50),
@image IMAGE
)
AS
INSERT INTO photos
VALUES (@name,@image)
RETURN @@identity
go
基本语法错误就是这些,不过提醒一下image或text这样的类型不能作为变量声明,你这种存储过程也是不行的……
参考技术A @SQL等变量太小了,连接的字符串可能被截断了。
而且,申明变量时是varchar类型,字符串连接时却用了unicode,所以能存储的字符更少了。
建议将@SQL等变量申明大一些。
例如:
declare @SQL NVARCHAR(3000)
...
参考技术B 哇,好长啊 参考技术C 参数都没有,用神马储存过程 参考技术D EXEC sp_executesql @SQL,N'@Page AS INT OUTPUT,@Count AS INT OUTPUT', @Page OUTPUT, @Count OUTPUT,@VOL_ID
变量没有声明

以上是关于Sqlserver存储过程如何写循环的主要内容,如果未能解决你的问题,请参考以下文章

如何写sqlserver2000存储过程?用于批量录入数据,求解

SqlServer存储过程

sqlserver 存储过程 使用事务,说明在下边,求大神指教!

我写了一段存储过程 是SQLSERVER的代码如下:

sqlserver如何调用外部数据库的存储过程

sqlserver 存储过程 返回结果集的 例子