Sqlserver存储过程如何写循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlserver存储过程如何写循环相关的知识,希望对你有一定的参考价值。
参考技术A declare @i intset @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'。
求教各位大大们怎么解答 小弟不胜感激 急活 在线等
(
@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存储过程?用于批量录入数据,求解