sqlserver存儲過程表變數
create procere 把考號分配給2個班的學號最小的前5位同學
as
BEGIN
;WITH cte AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY GETDATE()) ,* FROM EXAM
),
stuu1 AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY stuid) ,* FROM stu WHERE clazz='1班';
),
stuu2 AS
(
SELECT rn=ROW_NUMBER()OVER(ORDER BY stuid)+5 ,* FROM stu WHERE clazz='2班';
),
stuu AS
(
SELECT * FROM stuu1
UNION ALL
SELECT * FROM stuu2
)
UPDATE c
SET c.stuID = s.stuID
FROM cte c JOIN stuu s ON c.rn=s.rn
end
Ⅱ sqlserver怎麼創建存儲過程
1、可視化創建
a.登錄SQL Server
b.打開資料庫==》要創建存儲過程的資料庫==》可編程性==》存儲過程
c.選中「存儲過程」右擊 ,在系出現的對話框中選擇「新建存儲過程」
d.在右側出現的對話框中填寫具體存儲過程內容完成後執行即可
2、代碼創建
a.全手寫代碼
一、定義變數
--簡單賦值
declare@aint
set@a=5
print@a
--使用select語句賦值
declare@user1nvarchar(50)
select@user1='張三'
print@user1
declare@user2nvarchar(50)
select@user2=NamefromST_UserwhereID=1
print@user2
--使用update語句賦值
declare@user3nvarchar(50)
updateST_Userset@user3=NamewhereID=1
print@user3
二、表、臨時表、表變數
--創建臨時表1
createtable#DU_User1
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
);
--向臨時表1插入一條記錄
insertinto#DU_User1(ID,Oid,[Login],Rtx,Name,[Password],State)values(100,2,'LS','0000','臨時','321','特殊');
--從ST_User查詢數據,填充至新生成的臨時表
select*into#DU_User2fromST_UserwhereID<8
--查詢並聯合兩臨時表
select*from#DU_User2whereID<3unionselect*from#DU_User1
--刪除兩臨時表
droptable#DU_User1
droptable#DU_User2
--創建臨時表
CREATETABLE#t
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL,
)
--將查詢結果集(多條數據)插入臨時表
insertinto#tselect*fromST_User
--不能這樣插入
--select*into#tfromdbo.ST_User
--添加一列,為int型自增長子段
altertable#tadd[myid]intNOTNULLIDENTITY(1,1)
--添加一列,默認填充全球唯一標識
altertable#tadd[myid1](newid())
select*from#t
droptable#t
--給查詢結果集增加自增長列
--無主鍵時:
selectIDENTITY(int,1,1)asID,Name,[Login],[Password]into#tfromST_User
select*from#t
--有主鍵時:
select(selectSUM(1)fromST_UserwhereID<=a.ID)asmyID,*fromST_UseraorderbymyID
--定義表變數
declare@ttable
(
idintnotnull,
msgnvarchar(50)null
)
insertinto@tvalues(1,'1')
insertinto@tvalues(2,'2')
select*from@t
三、循環
--while循環計算1到100的和
declare@aint
declare@sumint
set@a=1
set@sum=0
while@a<=100
begin
set@sum+=@a
set@a+=1
end
print@sum
四、條件語句
--if,else條件分支
if(1+1=2)
begin
print'對'
end
else
begin
print'錯'
end
--whenthen條件分支
declare@todayint
declare@weeknvarchar(3)
set@today=3
set@week=case
when@today=1then'星期一'
when@today=2then'星期二'
when@today=3then'星期三'
when@today=4then'星期四'
when@today=5then'星期五'
when@today=6then'星期六'
when@today=7then'星期日'
else'值錯誤'
end
print@week
五、游標
declare@IDint
declare@Oidint
declare@Loginvarchar(50)
--定義一個游標
declareuser_curcursorforselectID,Oid,[Login]fromST_User
--打開游標
openuser_cur
while@@fetch_status=0
begin
--讀取游標
fetchnextfromuser_curinto@ID,@Oid,@Login
print@ID
--print@Login
end
closeuser_cur
--摧毀游標
deallocateuser_cur
六、觸發器
觸發器中的臨時表:
Inserted
存放進行insert和update操作後的數據
Deleted
存放進行delete和update操作前的數據
--創建觸發器
CreatetriggerUser_OnUpdate
OnST_User
forUpdate
As
declare@msgnvarchar(50)
--@msg記錄修改情況
select@msg=N'姓名從「'+Deleted.Name+N'」修改為「'+Inserted.Name+'」'fromInserted,Deleted
--插入日誌表
insertinto[LOG](MSG)values(@msg)
--刪除觸發器
droptriggerUser_OnUpdate
七、存儲過程
--創建帶output參數的存儲過程
CREATEPROCEDUREPR_Sum
@aint,
@bint,
@sumintoutput
AS
BEGIN
set@sum=@a+@b
END
--創建Return返回值存儲過程
CREATEPROCEDUREPR_Sum2
@aint,
@bint
AS
BEGIN
Return@a+@b
END
--執行存儲過程獲取output型返回值
declare@mysumint
executePR_Sum1,2,@mysumoutput
print@mysum
--執行存儲過程獲取Return型返回值
declare@mysum2int
execute@mysum2=PR_Sum21,2
print@mysum2八、自定義函數
函數的分類:
1)標量值函數
2)表值函數
a:內聯表值函數
b:多語句表值函數
3)系統函數--新建標量值函數
createfunctionFUNC_Sum1
(
@aint,
@bint
)
returnsint
as
begin
return@a+@b
end
--新建內聯表值函數
createfunctionFUNC_UserTab_1
(
@myIdint
)
returnstable
as
return(select*fromST_UserwhereID<@myId)
--新建多語句表值函數
createfunctionFUNC_UserTab_2
(
@myIdint
)
returns@ttable
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
)
as
begin
insertinto@tselect*fromST_UserwhereID<@myId
return
end
--調用表值函數
select*fromdbo.FUNC_UserTab_1(15)
--調用標量值函數
declare@sint
set@s=dbo.FUNC_Sum1(100,50)
print@s
--刪除標量值函數
dropfunctionFUNC_Sum1
談談自定義函數與存儲過程的區別:
一、自定義函數:
1.可以返回表變數
2.限制頗多,包括
不能使用output參數;
不能用臨時表;
函數內部的操作不能影響到外部環境;
不能通過select返回結果集;
不能update,delete,資料庫表;
3.必須return一個標量值或表變數
自定義函數一般用在復用度高,功能簡單單一,爭對性強的地方。
二、存儲過程
1.不能返回表變數
2.限制少,可以執行對資料庫表的操作,可以返回數據集
3.可以return一個標量值,也可以省略return
存儲過程一般用在實現復雜的功能,數據操縱方面。
Ⅲ sqlserver 存儲過程中變數賦值
你沒有把問題寫多明白啊不過看你得描述,應該是在 as後面聲明的局部變數。按你得用法絕對是沒有問題的,我試過沒問題啊。你說的「if @cc = 0這個判斷失效」是什麼意思呢?是表裡面有記錄自然@cc!=0,,「在判斷前面加select @cc的時候就可以」又是什麼意思?執行存儲過程的話,if只是判定條件只有select才會列印出數據~~~~~~~
Ⅳ sqlserver存儲過程中 如何把表變數轉換成數值
直接將表名也改為varchar(50) 就行了
要不你就用預執行
if exists(select * from sysobjects where name='proc_select')
drop proc proc_select
go
create proc proc_select
@table varchar(50)
as
declare @sql varchar(8000)
set @sql='select * from '+@table
exec(@sql)
go
exec proc_select 'Types'
Ⅳ sqlserver存儲過程: Exec(@變數)在一個存儲過程中調用如何有參數返回變數查詢值
create proc proc_find_count13
@column_name varchar(20)
,@term varchar(20)
as
declare @sel varchar(500)
SET @sel='declare @count int ;set @count=(select count(*) from proct where ' + @column_name + ' like ''%'+@term+'%''); print @count;'
EXECute (@sel)
go
exec proc_find_count13 'p_name','c'
Ⅵ SqlServer存儲過程
create
procere
prCreateSubPlan
as
begin
declare
@id
int,
@intCycle
int,
@planName
varchar(100),
@createTime
smalldatetime,
@cycleTime
int
select
@id
=
min(t_cplan_id)
from
t_cplan
while
(@id
is
not
null)
begin
select
@planName=t_plan_name,
@createTime
=
createTime,
@cycleTime
=
cycleTime
from
t_cplan
where
t_cplan_id=@id
select
@intCycle=
0
while
(@intCycle<@cycleTime)
begin
--
表t_plan
列t_plan_id是IDENTITY
列
insert
t_plan
(t_plan_name,
t_cplan_id,
createTime)
values
(@planName,
@id,
dateadd(day,
@intCycle,
@createTime))
select
@intCycle
=
@intCycle
+
1
end
select
@id
=
min(t_cplan_id)
from
t_cplan
where
t_cplan_id>@id
end
end
go
Ⅶ 有關於sqlserver的存儲過程的問題:@xxx 和 declare @xxx有什麼不同
@xxx 和 declare @xxx有什麼不同?
前者是在已經定義的情況下使用,後者是定義。
【有疑問可以HI我,或追問,但請不要關閉問題,謝謝!】
PS:
SQL Server中定義變數的方法:
全局變數 DECLARE @@變數名 類型
局部變數 DECLARE @變數名 類型
賦值方式:
--一. SET賦值
DECLARE @Name varchar(50),@@Name varchar(50)
SET @Name='局部張三'
SET @@Name='全局張三'
SELECT @@Name+' '+@Name
--二. SELECT 賦值
DECLARE @Name varchar(50),@@Name varchar(50)
SELECT @Name='局部張三',@@Name='全局張三'
SELECT @@Name+' '+@Name
--順便說下
--1.變數的作用域是有限的
--2.進行變數操作,需初始化
DECLARE @Name varchar(50)
--SET @Name=''
SET @Name = @Name+'張三'
SELECT @Name --結果將為NULL
--3.變數也是存在表變數,表變數與物理表存在一定區別