2015-05-22 5 views
3

Я создал масштабирующее UDF (называемое sCurrentAppUser()) в SQL Server 2012 Express, и я бы хотел использовать этот UDF в качестве значения по умолчанию при определении таблицы. Но каждый раз, когда я пытаюсь, я получаю сообщение об ошибке «sCurrentAppUser» не является признанным встроенным именем функции ».Использовать UDF как значение по умолчанию в столбце таблицы в SQL Server

Поскольку я не могу опубликовать более двух ссылок (репутация), я буду ссылаться на мои исследования и ссылки в комментарии.

Вот мой UDF:

ALTER FUNCTION [dbo].[sCurrentAppUser]() 
RETURNS nVarChar(128) 
AS BEGIN 
    DECLARE @CurrentAppUser nVarChar(128) 

    IF EXISTS (SELECT 1 FROM ActiveConnections WHERE ComputerName = host_name()) BEGIN 
     SELECT @CurrentAppUser = CONVERT (nVarChar(128), LoginUser) 
     FROM  ActiveConnections 
     WHERE ComputerName = host_name() 

    END ELSE BEGIN 
     SELECT @CurrentAppUser = Convert (nVarChar(128), suser_sname()) 
     WHERE NOT EXISTS (
        SELECT 1 
        FROM  ActiveConnections 
        WHERE ComputerName = host_name() 
       ) 

    END 

    RETURN @CurrentAppUser 

END 

И моя попытка создать таблицу с ограничением по умолчанию на первой колонке:

CREATE TABLE [dbo].[Clients](
    [ModifyingUser] [nvarchar](128) NOT NULL DEFAULT sCurrentAppUser(), 
    [Modification] [char](1) NULL DEFAULT 'A', 
    [ModifyingHost] [nvarchar](128) NOT NULL DEFAULT host_name(), 
    [ClientID] [uniqueidentifier] NOT NULL, 
    [Label] [nvarchar](1024) NULL, 
    CONSTRAINT [PK_Clients] PRIMARY KEY (
     [ClientID] ASC 
    ) 
) 
+0

[Эта страница] (http://www.techrepublic.com/blog/the-enterprise-cloud/understand-when-to-use-user-defined-functions-in-s ql-server /), в частности, говорит: «Вы можете использовать скалярно-значные UDF как значение по умолчанию для столбца в таблице». [Документация MSDN] (https://technet.microsoft.com/en-us/library/ms191320 (v = sql.110) .aspx) ничего не говорит о невозможности сделать это. – Jason

+0

[Эта тема форума] (http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=165697) дает пример синтаксиса, рассматривая его как вычисляемый столбец вместо ограничения по умолчанию, но это не работает для я тоже. И [этот вопрос в StackExchange] (http://stackoverflow.com/questions/1744455/using-udf-for-default-value-of-a-column) говорит об использовании параметризованного UDF в качестве ограничения по умолчанию, но «Ответ» говорит о том, что вообще не используется UDF. – Jason

ответ

6

Вы должны добавить имя схемы для этой функции:

CREATE TABLE [dbo].[Clients](
    [ModifyingUser] [nvarchar](128) NOT NULL DEFAULT dbo.sCurrentAppUser(), 
    [Modification] [char](1) NULL DEFAULT 'A', 
    [ModifyingHost] [nvarchar](128) NOT NULL DEFAULT host_name(), 
    [ClientID] [uniqueidentifier] NOT NULL, 
    [Label] [nvarchar](1024) NULL, 
    CONSTRAINT [PK_Clients] PRIMARY KEY (
     [ClientID] ASC 
    ) 
) 
+0

Отмечено как решена. Мне просто жаль, что я не смогу дать вам больше удовольствия, чем за быстрый и правильный ответ. Благодаря! – Jason

+0

Вы имеете в виду использование dbo.sCurrentAppUser() вместо sCurrentAppUser(), nice .. – numbtongue