Sql 行插入函数

Sql 行插入函数,sql,sql-server,postgresql,tsql,Sql,Sql Server,Postgresql,Tsql,我是SQL Server的新手,我有一些Oracle和PostgreSQL的经验和实践,我想在SQL Server中使用这些经验和实践 我需要创建一个函数,它为表中的新行获取字段值,并返回自动生成的新记录的ID值 首先,我要面对一个事实,SQL Server中的函数不能更改表中的数据。我的第二个发现是SQL Server中的过程可以通过return@result构造返回值 我研究了DML查询的output机制,但它们返回的不是标量结果,而是表结果 耐心点,让我更清楚。有一个PostgreSQL函

我是SQL Server的新手,我有一些Oracle和PostgreSQL的经验和实践,我想在SQL Server中使用这些经验和实践

我需要创建一个函数,它为表中的新行获取字段值,并返回自动生成的新记录的ID值

首先,我要面对一个事实,SQL Server中的函数不能更改表中的数据。我的第二个发现是SQL Server中的过程可以通过
return@result
构造返回值

我研究了DML查询的
output
机制,但它们返回的不是标量结果,而是表结果

耐心点,让我更清楚。有一个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;
和函数脚本:

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中以相同的方式创建类似的内容?

在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;

如果愿意,您可以将其封装在存储过程中,但这似乎不是必需的,而且存储过程与函数具有不同的语义。

很抱歉这个愚蠢的问题。在您的示例中使用
select'value'
而不是
values('value')
有什么用途吗?这是必要的还是仅仅是一种习惯?是的,这两种方法都有效,但是为什么你更喜欢其中一种呢?谢谢你的关注。我更喜欢
插入。选择
,因为它执行所有操作
插入。值
可以,等等。感谢您的解释。是的<代码>声明@t表(foo-bigint)
从@t中选择foo工作正常,但无法从查询中捕获并仅返回一个值。换句话说:在我的示例中(让我们返回到它们)`insert-into-foobar(bar)值(p_-bar),将foo返回到result;`返回
结果
变量中插入的值。有什么方法可以用MSSQL实现吗?@Abelisto。在SQL Server中,用户定义的函数无法修改数据库。你可以用存储过程做你想做的事情,但是存储过程不会像函数那样返回值。谢谢你的回答。@marc-s谢谢你的关注。我不确定是否要将“MS SQL”替换为“SQL server”,因为在我看来,“SQL server”是一个为某些数据提供SQL查询的程序。所以“SQLServer”可以是任何东西,比如Firebird、Postgres、SQLite、Oracle等等。不要只称“SQLServer”为M$创建的一个不完美的产品。谢谢