Function 临时表中的TSQL默认列值

Function 临时表中的TSQL默认列值,function,tsql,default,temporary,Function,Tsql,Default,Temporary,当我尝试创建此表时,出现一个错误,表示无法识别fns_GetSomeDate: create table #tmpTable( id INT, validity datetime NOT NULL default (dbo.fns_GetSomeDate()) ) 并且返回错误:“在此上下文中不允许列“dbo”,并且用户定义的函数或聚合“dbo.fns_GetSomeDate”找不到。” 但是,当我尝试创建相同的表但不是临时表(没有“#”)时,一切正常: create table tmpTab

当我尝试创建此表时,出现一个错误,表示无法识别fns_GetSomeDate:

create table #tmpTable(
id INT,
validity datetime NOT NULL default (dbo.fns_GetSomeDate())
)
并且返回错误:“在此上下文中不允许列“dbo”,并且用户定义的函数或聚合“dbo.fns_GetSomeDate”找不到。”

但是,当我尝试创建相同的表但不是临时表(没有“#”)时,一切正常:

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

功能确实存在。有人知道如何解决这个问题吗?

您需要在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()
)

创建临时表时,它存储在
tempdb
中。我猜是因为你的函数不存在于数据库中?这很有趣。
tempdb
中缺少该函数。您需要首先在那里创建它。但是,当由于重新启动或其他原因而清除了
tempdb
对象时,您将使用该函数。此外,我还尝试在
默认值
约束中使用
数据库.schema.function\u name
,但这是不允许的。这就是我在开始时怀疑的,问题与范围相关。我尝试了
some_db.dbo.fns_GetSomeDate
,但也不起作用,错误:在此上下文中不允许使用“some_db”名称。有效表达式是常量、常量表达式和(在某些上下文中)变量。不允许使用列名。我尝试将函数的值存储在局部变量中,但CREATE TABLE语句中不允许使用“”变量。“@user3246112是的,没错。可以共享功能体吗?可以直接在create语句中使用代码?@user3246112简化代码。为什么临时表中需要默认值?为什么一开始就需要临时表?为什么不修改填充该表的INSERT语句呢?是的,在temp数据库中创建函数是可行的,但是这是一个企业解决方案,而且是一个肮脏的攻击:)@user3246112您的意思是,使用一个函数的默认值创建一个temp表?很有可能。但是,如果您使用这样的黑客,则必须提供正确的函数名。临时表是在tempdb中创建的
dbo。任何
都指向当前数据库。如果在tempdb对象中使用它,它将引用tempdb。如果要使用在不同数据库中定义的函数,还必须提供数据库名称,例如
myDb.dbo.MyFunc
。但是可能不起作用-默认值有很多限制