存储过程

有b_jihua_xiangmu和b_jihua_jsgm两张表,他们都有一个相同的xmbm(编号) 都是从1~N,然后他们又有相同的一列f_cr_jsgm,
b_jihua_xiangmu这张表中f_cr_jsgm中有1~50条数据,  b_jihua_jsgm这张表有100条数据,但是第1~50条为空,把xiangmu表中的第1~50条update到
jsgm表中 用到如下存储过程 还没有看懂额.....
create proc pro_abc
as
declare @p1 nvarchar(50),@p2 int;
declare my_cursor cursor scroll dynamic 
for SELECT F_CR_JSGM,f_nb_xmbm FROM B_JIHUA_XIANGMU WHERE NOT  F_CR_JSGM IS NULL 
	open my_cursor 
	fetch next from my_cursor into @p1,@p2
	while(@@fetch_status=0)
	  begin
		update b_jihua_jsgm set f_cr_jsgm2=@p1 where f_nb_xmbm=@p2
		fetch next from my_cursor into @p1,@p2
	  end
	close my_cursor
	deallocate my_cursor
又在网上发现如下存储过程
这个原本不完全的,被我一次次实验搞好了,嘿嘿 这个是给text表中插入10000条数据,
create proc pro_5
as
declare   @i  int, @name nvarchar(50)
set   @i=0 
set   @name=''
while   @i <10000 
begin      
	set   @i=@i+1 
	set	  @name='name'+cast(@i as nvarchar(50)) 
	insert into  test(lid,lname) values(@i,@name)
end
但是呢会写不知道原理啊,然后看了下资料:http://www.blueidea.com/tech/program/2006/3972_3.asp
这个资料好啊   简单明了,办事不少 呵呵
最后说下其中的艰辛历史啊 血泪啊 ,呵呵
注意:声明变量、sql命令要在set的下方
根据我出现的问题,因为上班的时候没有整理,所以只能给大家结果看了,遇到问题就是begin里边写错了,造成@i一直=0所以大家懂得
正运行呢提示 事务已满, google下 在csdn上边 看到个好东西,就在底下 先备份数据库下 然后截断事务日志 然后压缩日志
要不然你在增删改查就操作不了啦
exec pro_5
--执行存储过程
drop proc pro_5
--删除存储过程
backup   log   jihua   with   no_log 
go 
--截断事务日志
dbcc   shrinkdatabase(jihua) 
go 
--压缩日志
看来自己动手,兴趣满满啊
------------------------------------------------------------------
--得到.之前字母的个数
select charindex('.','abc.doc')
--得到.之前的字符串
select substring('abc.doc',0,charindex('.','abc.doc'))
--在这个存储过程中使用
declare @temp varchar(50);
select @temp=substring('abc.doc',0,charindex('.','abc.doc'))
------------------------------------------------------------------
--一个表中有doc和xls两列 它们的前缀应该相同 比如 a.doc  a.xls 如果不同 下面的方法可以修改的
create proc proc_jihua
as
declare @F_BY_IMGNAME   varchar(MAX),@F_BY_CIMGNAME VARCHAR(MAX);
declare my_cursor cursor scroll dynamic 
for select substring(F_BY_IMGNAME,0,charindex('.',F_BY_IMGNAME)),F_BY_CIMGNAME from b_jihua_jihua where F_BY_CIMGNAME!=''
open my_cursor
fetch  next from my_cursor into @F_BY_IMGNAME,@F_BY_CIMGNAME
while(@@fetch_status=0)
begin
	update b_jihua_jihua set  F_BY_CIMGNAME=@F_BY_IMGNAME+'.xls' where F_BY_IMGNAME=@F_BY_IMGNAME+'.doc' or F_BY_IMGNAME=@F_BY_IMGNAME+'docx'
	fetch next from my_cursor into @F_BY_IMGNAME,@F_BY_CIMGNAME
end 
close my_cursor
deallocate my_cursor
--go--这里加上go的话 底下exec就错咧..找不到存储过程  如果没有go这个存储过程只能使用一次的呦
drop proc  proc_jihua
go
--go是接着执行下边的sql语句 没有go 就到这里截止了,底下就不执行了得你重新执行底下的sql语句--
exec proc_jihua
------------------------------------------------------------

--------------------------------------------------------
--split函数
Create FUNCTION [dbo].[Split]
 (@origStr varchar(8000),  --待拆分的字符串
  @markStr varchar(100))   --拆分标记,如','
 RETURNS @splittable table
 (
 id   varchar(4000) NOT NULL, --编号ID
 item   varchar(2000) NOT NULL  --拆分后的字符串
 )
AS 
BEGIN
 DECLARE @strlen int,@postion int,@start int,@sublen int,@TEMPstr varchar(200),@TEMPid int
 SELECT @strlen=LEN(@origStr),@start=1,@sublen=0,@postion=1,@TEMPstr='',@TEMPid=0
 
 if(RIGHT(@origStr,1)<>@markStr )
 BEGIN
  SET @origStr = @origStr + @markStr
 END
 WHILE((@postion<=@strlen) and (@postion !=0))
  BEGIN
   IF(CHARINDEX(@markStr,@origStr,@postion)!=0)
    BEGIN
     SET @sublen=CHARINDEX(@markStr,@origStr,@postion)-@postion; 
    END
   ELSE
    BEGIN
     SET @sublen=@strlen-@postion+1;
    END
   IF(@postion<=@strlen)
    BEGIN
     SET @TEMPid=@TEMPid+1;
     SET @TEMPstr=SUBSTRING(@origStr,@postion,@sublen);
     INSERT INTO @splittable(id, item) values(@TEMPid,@TEMPstr)
     IF(CHARINDEX(@markStr,@origStr,@postion)!=0)
      BEGIN
       SET @postion=CHARINDEX(@markStr,@origStr,@postion)+1
      END
     ELSE
      BEGIN
       SET @postion=@postion+1
      END
    END
  END
 RETURN
END
go
--使用函数
select * from Split('2005-05-05','-')
go
--删除函数
drop function split
原文地址:https://www.cnblogs.com/0banana0/p/2065199.html