2014-09-21 61 views
0

我相對新手使用SQL Server,並且我有一些來自Oracle的經驗和實踐&我想在SQL Server中使用PostgreSQL。用於行插入的函數

我需要創建函數,該函數接受表中新行的字段值,並返回新記錄的自動生成的ID值。

首先,我面臨的事實是,SQL Server中的函數不能更改表中的數據。第二個我發現的是,SQL Server中的程序可以通過return @result構造返回值。

我調查了output機制的DML查詢,但它們不返回標量,而是返回表結果。

請耐心等待,讓我更清楚。這裏是做什麼,我想PostgreSQL的功能:

表創建腳本:

create table foobar 
(
    foo bigint not null default nextval('s_foobar'::regclass), 
    bar character varying(16), 
    constraint pk_foobar primary key (foo) 
); 

和功能的腳本:

create or replace function f_foobar_insert(p_bar character varying) 
    returns integer as 
$body$declare 
    result integer; 
begin 
    insert into foobar(bar) values (p_bar) returning foo into result; 
    return result; 
end;$body$ language plpgsql; 

是否有可能使在像這樣在SQL Server同樣的方式?

+0

@ marc-s感謝您的關注。我不確定將「MS SQL」替換爲「SQL服務器」在我看來,「SQL服務器」是一個爲某些數據提供SQL查詢的程序。所以「SQL服務器」可以是任何東西,如Firebird,Postgres,SQLite,Oracle等。不要將「SQL服務器」只稱爲一個,而不是由M $創建的完美產品。謝謝。 – Abelisto 2014-09-21 16:30:04

回答

2

在SQL Server中,創建表將是:

create table foobar 
(
    foo bigint not null identity primary key, 
    bar varchar(16) 
); 

以下是在SQL Server中的一種方式來獲得的功能:

insert into foobar(bar) select 'value'; 

select @@identity; 

這不是真正的首選方式。你真的應該使用output條款:

declare @t table (foo bigint); 

insert into foobar(bar) 
    output inserted.foo into @t 
    select 'value'; 

select foo from @t; 

,如果你願意的話,可以在存儲過程中把這個包,但似乎有必要不和存儲過程具有功能不同的語義。

+0

對不起,很愚蠢的問題。在你的例子中,使用'select'value''而不是'values('value')'有什麼用處?這是必要的還是僅僅是一種習慣?是的,它在兩個方面都有效,但爲什麼你更喜歡另一個呢?感謝您的關注。 – Abelisto 2014-09-21 15:33:24

+0

我更喜歡'insert。 。 。選擇'因爲它完成了所有插入操作。 。 。價值觀',還有更多。 – 2014-09-21 16:25:08

+0

感謝您的解釋。而且是的。 '聲明@t table(foo bigint);'和'從@t中選擇foo''可以正常工作,但是沒有辦法從查詢中捕獲和返回一個值。換句話說:在我的例子中(讓我們回到它們)'插入foobar(bar)值(p_bar),將foo返回到結果中;'返回插入值到result變量中。有什麼辦法可以用MSSQL做到這一點嗎? – Abelisto 2014-09-21 16:41:56