2017-09-21 7 views
1

Lorsque je tente de créer cette table, il y a une erreur en disant que fns_GetSomeDate ne reconnaît pas:TSQL valeur de la colonne par défaut dans le tableau temporaire

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

et l'erreur: « Colonne « dbo »n'est pas autorisé dans ce contexte, et la fonction définie par l'utilisateur ou l'agrégat "dbo.fns_GetSomeDate" n'a pas pu être trouvée. " est retourné.

Mais lorsque je tente de créer la même table, mais pas comme une table temporaire (sans le « # ») tout fonctionne OK:

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

Fonction existe. Est-ce que quelqu'un sait comment résoudre ce problème?

+0

Lorsque vous créez une table temporaire, il est stocké dans 'tempdb'. Je suppose que c'est parce que votre fonction n'existe pas dans cette base de données? – Bridge

+0

C'est intéressant. La fonction est manquante dans 'tempdb'. Vous devez le créer d'abord là. Mais lorsque les objets 'tempdb' sont clairs en raison d'un redémarrage ou d'autre chose, vous allez utiliser la fonction. De plus, j'ai essayé d'utiliser 'database.schema.function_name' dans la contrainte' default', mais ce n'est pas autorisé. – gotqn

+0

C'est ce que je soupçonnais au début, que le problème est lié à la portée. J'ai essayé 'some_db.dbo.fns_GetSomeDate' et cela ne fonctionnait pas non plus, Erreur: Le nom" some_db "n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonne ne sont pas autorisés. J'ai essayé de stocker la valeur de fuction dans une variable locale, mais '' Les variables ne sont pas autorisées dans l'instruction CREATE TABLE. " – user3246112

Répondre

1

vous devez créer la fonction dans tempdb et il travaillera

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

Oui, la création de fonction dans la base de données temporaire fonctionnera, mais c'est une solution d'entreprise et c'est un hack sale :) – user3246112

+0

@ user3246112 vous voulez dire, avoir une table temporaire avec une valeur par défaut qui vient d'une fonction? Probablement. Si vous utilisez un tel hack, vous devez fournir le nom de la fonction * correct *. Les tables temporaires sont créées dans tempdb. 'dbo.Whatever 'fait référence à la base de données actuelle. Si vous l'utilisez dans un objet tempdb, cela fait référence à tempdb. Si vous souhaitez utiliser une fonction définie dans une base de données * différente *, vous devez également indiquer le nom de la base de données, par exemple 'myDb.dbo.MyFunc'. Probablement ne fonctionnera pas si - les valeurs par défaut ont de nombreuses restrictions –