2011-10-23 99 views
1

我想寫一個t-sql存儲過程(aka sproc),它從'MyTable'中選擇3列。另外,我想更新同一個sproc中的表格:tsql:「更新」之前是否可以「返回select」?

  1. 我從表中選擇第三個值。
  2. 如果它等於「真」,我想更新表中的「假」

我不知道我應該用什麼語法的相關記錄。你能幫我嗎?

ALTER procedure [dbo].[My_PROC] 
    @ID varchar(10) 
AS 
BEGIN 

    declare @Col3 bit; 

    set @Col3 = select Col3 
    from dbo.MyTable with (nolock) 
    where @ID = ID 


    if @Col3 = 'true' 
     update dbo.dbo.MyTable set col3 = 'false' 
     where @ID = ID 

    select Col1, 
    Col2, 
    Col3 
    from dbo.MyTable table with (nolock) where @ID = ID, 
    table.Col1, 
    table.Col2, 
    @Col3 
END 

編輯:我想返回原來COL3(未更新值)。

+0

「user-procedure(aka usp)」不是通用的術語 - 存儲過程(AKA「sprocs」)通常在用戶和系統之間並沒有區別。系統擁有的sprocs存在,但由於您無法更改它們,所以這個區別是沒有意義的。 –

回答

1

用途:

ALTER procedure [dbo].[My_PROC] 
    @ID varchar(10) 
AS 
BEGIN 

    SELECT t.col1, 
      t.col2, 
      t.col3 
     FROM dbo.MyTable AS t WITH (NOLOCK) 
    WHERE t.id = @ID 

    -- No need for an IF statement to determine updating... 
    UPDATE dbo.dbo.MyTable 
     SET col3 = 'false' 
    WHERE id = @ID 
     AND t.col3 = 'true' 

END 

我不知道你打算什麼最終SELECT,但一旦我明白你的意圖是什麼,我可以更新它。

+0

謝謝。我想返回原來的Col3(不是更新後的值)。 –

+1

@Elad Benda:然後顛倒查詢的順序。更新了適合的答案,儘管這當然不明顯或最初提及。 –

+0

謝謝。只是爲了好奇:我如何從表中選擇一些值並從sql變量中選擇一些值? (我理解我的問題並不清楚 - 我想我應該重複它不只是在標題中) –

0

如果您使用的是SQL Server 2005或更高版本,則可以使用OUTPUT子句輸出原始值(如果它實際上已由查詢更新)。但是,如果行未被查詢更新,OUTPUT將不會爲您提供原始值。

declare @t table (
     ID int, 
     tf bit 
    ); 

    insert into @t values 
     (1,0), 
     (2,1), 
     (3,0); 

    declare @ID int = 2; 

    select * from @t 

    update @t set 
     tf = 0 
    output deleted.ID, deleted.tf 
    where ID = @ID; 

    select * from @t; 
相關問題