2017-09-21 159 views
1

當我試圖創建該表,有一個錯誤,指出fns_GetSomeDate無法識別:TSQL默認列值

create table #tmpTable(
id INT, 
validity datetime NOT NULL default (dbo.fns_GetSomeDate()) 
) 

和錯誤:「列‘DBO’不允許在此上下文和用戶定義的函數或集合「dbo.fns_GetSomeDate」無法找到。「返回。

但是當我嘗試創建相同的表,但不是作爲一個臨時表(不帶「#」)一切正常OK:

create table tmpTable(
id INT, 
validity datetime NOT NULL default (dbo.fns_GetSomeDate()) 
) 

功能確實存在。有人知道如何解決這個問題嗎?

+0

當你創建一個臨時表,它存儲在'tempdb'。我想這是因爲你的函數不存在於該數據庫中? – Bridge

+0

這很有趣。 'tempdb'中缺少該函數。您需要先在那裏創建它。但是當tempdb對象由於重啓或其他原因而被清除時,您將使用該函數。另外,我嘗試在'default'約束中使用'database.schema.function_name',但它不被允許。 – gotqn

+0

這就是我一開始就懷疑的問題,即問題與範圍有關。我已經嘗試過'some_db.dbo.fns_GetSomeDate',它也沒有工作,錯誤:在這種情況下不允許使用名字「some_db」。有效表達式是常量,常量表達式和(在某些情況下)變量。列名不被允許。我已經嘗試將函數的值存儲在本地變量中,但「CREATE TABLE語句中不允許使用變量」。 – user3246112

回答

1

你需要在tempdb中創建的功能,也將努力

use tempdb 
go 
create function fn_getdate 
(
) 
returns datetime 
as 
begin 



declare @dt datetime 
select @dt= getdate() 
return @DT 
end 


create table #tmpTable(
id INT, 
validity as dbo.fn_getdate() 
) 
+0

是的,在臨時數據庫中創建函數將工作,但這是一個企業解決方案,它是一個骯髒的破解:) – user3246112

+0

@ user3246112你的意思是,有一個臨時表與默認值來自一個函數?最有可能的。如果你使用這樣的黑客,你必須提供*正確的*函數名稱。臨時表在tempdb中創建。 'dbo.Whatever'是指當前的數據庫。如果您在tempdb對象中使用它,則它指向tempdb。如果你想使用在* * *數據庫中定義的函數,你還必須提供數據庫名稱,例如'myDb.dbo.MyFunc'。可能不會工作 - 默認值有很多限制 –