2015-01-21 58 views
0

我有類似以下內容的用戶定義的函數:是否可以命名由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中爲第一次運行UDF時臨時返回表的主鍵創建的(我不知道爲什麼這應該繼續存在....)。

+0

擺脫'約束pk_paying_customers',它應該工作。 – siride 2015-01-21 02:42:00

+0

謝謝@siride,也有效。但我仍然有sys.objects中的主鍵對象的問題。 – 2015-01-21 15:40:53

回答

1

當你在函數返回的表變量上指定一個主鍵時,它會得到一個名字,但它是某種默認名稱,並且就我而言看到你不能在函數聲明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提到的例子功能,然後跑到上面的查詢,我發現,對於表的主鍵該函數返回的名稱爲「PK__paying_c__CD65CB8504D1D82C」。

我確實發現可以在函數創建後重命名主鍵。繼續這個例子,它將是:

exec sp_rename 'PK__paying_c__CD65CB8504D1D82C', 'PK_PayingCustomersAreGreat' 

爲什麼要這樣做?沒有很好的理由,但在我的情況下,我們有一個應該遵守的命名約定,並且這些自動命名的主鍵開始顯示。

2

UDF返回一個表變量,而不是一個具體表(認爲DECLARE @t TABLECREATE TABLE),所以返回表和主鍵都不會在數據庫中表現出來。你不能命名一個表變量,因爲在任何給定的時間你都可以有多個副本,所以這些名字會有衝突。

您可以創建一個表,爲其指定一個主鍵,並將UDF結果放入表中。或者你可以忘記命名主鍵...

+0

表變量可以有一個主鍵,它肯定會定義用於將數據存儲在內存中的內部數據結構。 – siride 2015-01-21 02:44:08

相關問題