是否可以为 UDF 返回的 table 命名主键?

Is it possible to name the primary key for a table returned by a UDF?

我有一个类似于以下的用户定义函数:

create function paying_customers(@report_month int, @report_year int)
returns @customer_subs table
(
  customer_id int primary key not null,
  amount money not null
)
as
begin
etc.

这工作正常,但我想命名主键(它似乎作为一个对象保留在数据库中)。

以下给出错误信息(关键字约束附近的语法不正确):

create function paying_customers(@report_month int, @report_year int)
returns @customer_subs table
(
  customer_id int not null,
  amount money not null,
  constraint pk_paying_customers primary key clustered (customer_id)
)
as
begin
etc.

我正在尝试命名主键,因为我们有一个比较数据库的脚本,它发现了差异 - 在 sys.objects 中为临时返回的主键创建了一个对象 table 第一次 UDF 是 运行(我不确定为什么它应该继续存在....)。

一个 UDF return 是一个 table 变量,而不是具体的 table(想想 DECLARE @t TABLECREATE TABLE),所以 return table,也没有主键在数据库中体现。您不能命名一个 table 变量,因为在任何给定时间您可能有多个副本浮动,因此名称会发生​​冲突。

您可以创建一个 table,给它一个命名的主键,然后将 UDF 结果放入 table。或者你可以忘记命名主键...

当您在函数返回的 table 变量上指定主键时,它会获得一个名称,但它是某种默认名称,据我所知您无法指定您的在函数声明中拥有 syntax。要查看数据库中有哪些自动命名的主键,请使用此查询:

SELECT 
    i.name AS IndexName, 
    OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
    COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.OBJECT_ID = ic.OBJECT_ID
AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
and i.Name like 'PK[_][_]%'

当我创建 OP 提到的示例函数,然后 运行 上面的查询时,我发现该函数返回的 table 的主键被命名为 "PK__paying_c__CD65CB8504D1D82C" .

我确实发现您可以在创建函数后重命名主键。继续这个例子,它将是:

exec sp_rename 'PK__paying_c__CD65CB8504D1D82C', 'PK_PayingCustomersAreGreat'

为什么要这样做?没有很好的理由,但就我而言,我们有一个应该遵守的命名约定,并且这些自动命名的主键开始出现。