2017-09-21 102 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'。可能不会工作 - 默认值有很多限制 –