sql存儲過程update
DROPPROCEDUREexp3
GO
CREATEPROCEDUREexp3
@snchar(10)='2015200011',
@sjhchar(11)='12018060001',
@kgcjint,
@zgcjint,
@cjint
AS
UPDATEcyjgSETkgtcj=@kgcj,zgtcj=@zgcj,zcj=@cjWHEREsno=@snANDsjbh=@sjh;
go
EXECUTEexp3@kgcj=67,@zgcj=26,@cj=93
go
⑵ SQL存儲過程更新數據
表HC_RKDMX的相關欄位
YJSL OrderNO RKSL
先按OrderNO降序,得到
OrderNO RKSL YJSL
---4------5---NULL
---3------2---NULL
---2------4---NULL
---1------6---NULL
然後set @SL = 11
set YJSL =@SL -RKSL,減完為止
得到
OrderNO RKSL YJSL
---4------5----6
---3------2----4
---2------4----0
---1------6---NULL
再把最後減到為0的數變為11-(YJSL1+YJSL2)=1?
然後把剩下的不夠減的NULL變0?
而且還要把得到的YJSL更新到原來的ROWID列上?得到一個6 4 1 0的列按物理地址插入?就是說倒序插入?
OrderNO RKSL YJSL
---4------5----0
---3------2----1
---2------4----4
---1------6----6
如果set @SL = 13的話
OrderNO RKSL YJSL
---4------5----8
---3------2----6
---2------4----2
---1------6---(-4) 這里(-4)變為13-(5+2+4)=2?
如果@SL不剛好的排序後的全N個RKSL的和的話怎麼處理,負數和剩餘的NULL全部為0?
看不懂。。是不是你算錯了
應該是由@SL減去表裡的RKSL等於YJSL(安OrderNO一次序小到大的順序的計算,直到計算完為止)
OrderNO RKSL YJSL
---1------6----5
---2------4----1
---3------2----(-1)
---4------5---NULL
不知道是不是你算錯了~想來想去不知道你怎麼得到YJSL 6 4 1 0的唯一的可能是先降序 11-5=6 -2=4 -4=0那是6 4 0 NULL啊
囧。、。。自己本來還以為降序的
後面想來想去暈了~
其實存儲過程的話很好寫的,但是沒弄清楚你要得到什麼,怎麼得到
⑶ sql 中update的巧妙用法
觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。觸發器可以查詢其他表,而且可以包含復雜的 SQL 語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。創建觸發器的SQL語法DELIMITER |CREATE TRIGGER `<databaseName>`.`<triggerName>`< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] > ON <tableName> FOR EACH ROWBEGIN --do somethingEND |觸發器的優點觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用 CHECK 約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。比較觸發器與約束約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。例如:除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。觸發器到底可不可以在視圖上創建 在 SQL Server�6�4 聯機叢書中,是沒有說觸發器不能在視圖上創建的, 並且在語法解釋中表明:在 CREATE TRIGGER 的 ON 之後可以是視圖。 然而,事實似乎並不是如此,很多專家也說觸發器不能在視圖上創建。我也專門作了測試,
⑷ mssql中update中批量使用存儲過程執行結果
如果是函數,那麼返回值可以作為結果返回,那麼就是類似這樣的調用:
c=B(a,b),
update A set c=B(a,b);
如果是存儲過程,那麼返回值必然是使用out 參數返回的,那麼只能類似這樣調用:
B(a,b,out c)
顯然是無法像上面的函數式的調用,只能用游標一行一行調用。
或者
在這個存儲過程外面在加一個函數,在函數裡面調用B,然後再像上面直接在sql理解直接調用。
大概意思:
function B1(a,b) return as int
is
c int;
call B(a,b,c);
return c;
end
⑸ sql中創建關於更新的存儲過程
關於delphi調用存儲過程,用sql
server自帶的「創建存儲過程向導」給表login建立一個更新存儲過程。
懸賞分:100
|
離問題結束還有
12
天
18
小時
|
提問者:風風我依
|
檢舉
存儲過程代碼如下:已知表login有passname和password兩個欄位。
create
procere
[update_login_1]
(@passname_1
[varchar],
@passname_2
[varchar](50),
@password_3
[varchar](50))
as
update
[wqzx].[dbo].[login]
set
[passname]
=
@passname_2,
[password]
=
@password_3
where
(
[passname]
=
@passname_1)
go
-------------------------------------------------------------------------------------
在delp調用該存儲過程,要求只該改欄位中的password,即建一個文本框將裡面內容替換一個記錄中的password,而保持passname不變,簡單講就是修改一個用戶名的密碼。怎麼寫代碼?問題補充:
"強唐華"我試過這樣寫存儲過程了,沒用的,如果可以,那在delphi中怎麼寫代碼調用這個存儲過程?
強調下:這是sql自帶建立的存儲過程,就是由「創建存儲過程向導」生成,我覺得不會錯的,問題是怎麼在delphi中調用該存儲過程,代碼呢?
我建立了一個插入的存儲過程,代碼如下:
with
storedproc1
do
begin
parambyname('@passname_1').asstring:=edit1.text;
parambyname('@password_2').asstring:=edit2.text;
execproc;
if
params[0].asinteger=0
then
messagedlg('添加新用戶名成功!',mtinformation,[mbok],0)
else
messagedlg('添加用戶失敗!',mterror,[mbok],0);
end;
這段代碼是可以成功插入一個記錄的。現在是想修改某個記錄。
回答
共1條
create
procere
[dbo].[update_login]
(@name
varchar(50),
@password
[varchar](50))
as
update
useres
set
password=@password
where
name=
@name
這么簡單的存儲過程,都不會用?
sqlconnection
conn
=
new
sqlconnection("data
source=tq-pc;initial
catalog=tq;user
id=sa;password=123");
sqlcommand
cmd
=
new
sqlcommand("update_login",
conn);
cmd.commandtype
=
commandtype.storedprocere;
cmd.parameters.addwithvalue("@name",
textbox3.text.trim());
cmd.parameters.addwithvalue("@password",
textbox4.text.trim());
conn.open();
int
i
=
cmd.executenonquery();
if
(i
>
0)
response.write("密碼修改成功!");
else
response.write("密碼修改失敗!");
⑹ sql查詢語句問題,我想寫一個存儲過程,當查詢出來的結果滿足一個條件時,就會執行一條update語句。
存儲過程裡面加入條件判斷分支就行了
大致是:
DECLARE @myVar [類型]
SELECT @myVar=[列] FROM [表] WHERE 條件
IF @myVar=xxx
BEGIN
UPDATE ....
END
ELSE IF @myVar=xxxxx
BEGIN
UPDATE ....
END
ELSE IF ....
.....
⑺ SQL存儲過程update表內容,如果判斷比較多,怎麼增加變數優化
update set value= A where value=B
要更正的值相同,而且條件相同的,可以一起update
⑻ sql更新數據存儲過程怎麼寫
create procere update_table ( @c_tbname varchar(128), -- 要更新的表名
@c_upcolname varchar(1000), -- 要更新的欄位列表,以豆號隔開
@c_updata varchar(1000), -- 要更新的數據列表,以豆號隔開,要與相應的列一一對應
@c_id varchar(100) -- 要更新的關鍵字,沒有關鍵字的不能更新
)
as
begin
declare @c_sql varchar(max)
declare @i_bcol int
declare @i_ecol int
declare @i_bdata int
declare @i_edata int
if @c_id is null or @c_id = ''
return
set @i_bcol= 1
set @i_bdata= 1
set @c_sql = ' update ' + @c_tbname + ' set '
set @i_ecol = charindex(',' , @c_upcolname , @i_bcol )
while @i_ecol > 0
begin
set @c_sql = @c_sql + substring( @c_upcolname,@i_bcol,@i_ecol - 1 ) + ' = '
set @i_edata= charindex(',' , @c_updata, @i_bdata)
set @c_sql = @c_sql + '''' + substring( @c_updata,@i_bdata,@i_edata- 1 ) + ''' ,'
set @i_bcol = @i_ecol + 1
set @i_ecol = charindex(',' , @c_upcolname , @i_bcol )
end
set @c_sql = @c_sql + substring( @c_upcolname,@i_bcol,len@c_upcolname) - 1 ) + ' = '
set @c_sql = @c_sql + '''' + substring( @c_updata,@i_bdata,len(@c_updata)- 1 ) + ''' '
set @c_sql = @c_sql + ' where id = ''' + @c_id + ''' '
exec ( @c_sql )
end