Как создать глобальную переменную в SQL Server 2008 - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть представление, которое возвращает проекты пользователей, а также их окна входа в систему.Пример данных приведен ниже: -

project   | Login
------------------
project 1 | richab
project 2 | stevej

Мне нужно добавить домен к логину.Я мог бы поместить это в код, но я не хочу делать это в каждом представлении, которое я когда-либо создавал, которое тянет пользователей на вход.

Могу ли я создать глобальную переменную, на которую я могу ссылаться в коде представлений.Как я могу достичь этого?Какая лучшая практика для этого?

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Я не знаю, есть ли в SQL Server глобальные переменные, но вы можете использовать пользовательскую функцию следующим образом:

CREATE FUNCTION dbo.fn_GetDomainName()
RETURNS STRING
AS
BEGIN
    RETURN 'domain_name\\'
END

и выполните SELECT dbo.fn_GetDomainName() + Login FROM table WHERE ... в соответствующих местах в ваших представлениях.

2 голосов
/ 02 декабря 2011

В SQL Server нет такой вещи, как глобальная переменная.

Вы не можете просто сделать:

DECLARE @@GlobalVar int

Вы можете подделать его с помощью CONTEXT_INFO, но чтобы использовать что-то, что будет продолжаться после сеанса или перезапуска, вам нужно сделать что-то вроде этого:

USE master
IF OBJECT_ID('dbo.sp_GlobalVariables') IS NOT NULL
    DROP TABLE dbo.sp_GlobalVariables
GO
CREATE TABLE dbo.sp_GlobalVariables
(
    varName NVARCHAR(100) COLLATE Latin1_General_CS_AI,
    varValue SQL_VARIANT
)
GO

IF OBJECT_ID('dbo.sp_GetGlobalVariableValue') IS NOT NULL
    DROP PROC dbo.sp_GetGlobalVariableValue
GO
CREATE PROC dbo.sp_GetGlobalVariableValue
(
    @varName NVARCHAR(100),
    @varValue SQL_VARIANT = NULL OUTPUT 
)
AS
    SET NOCOUNT ON    
    -- set the output parameter
    SELECT    @varValue = varValue 
    FROM    sp_globalVariables 
    WHERE    varName = @varName

    -- also return it as a resultset
    SELECT    varName, varValue 
    FROM    sp_globalVariables 
    WHERE    varName = @varName
    SET NOCOUNT OFF
GO

IF OBJECT_ID('dbo.sp_SetGlobalVariableValue') IS NOT NULL
    DROP PROC dbo.sp_SetGlobalVariableValue
GO
CREATE PROC dbo.sp_SetGlobalVariableValue
(
    @varName NVARCHAR(100),
    @varValue SQL_VARIANT,
    @result CHAR(1) = NULL OUTPUT 
)
AS
    SET NOCOUNT ON
    UPDATE    dbo.sp_GlobalVariables 
    SET        varValue = @varValue
    WHERE    varName = @varName;    
    -- if it doesn't exist yet add it
    IF @@rowcount = 0
    BEGIN 
        INSERT INTO dbo.sp_GlobalVariables(varName, varValue)
        SELECT @varName, @varValue
        -- return it as inserted        
        SELECT @result = 'I'
    END 
    -- return it as updated
    SELECT @result = 'U'
    SET NOCOUNT OFF
GO

DECLARE @dt DATETIME
SELECT @dt = GETDATE()
EXEC sp_SetGlobalVariableValue 'GlobalDate', @dt;
EXEC sp_SetGlobalVariableValue 'GlobalInt', 5;
EXEC sp_SetGlobalVariableValue 'GlobalVarchar', 'This is a very good global variable'
EXEC sp_SetGlobalVariableValue 'GlobalBinary', 0x0012314;

GO

EXEC sp_GetGlobalVariableValue 'GlobalDate' 
EXEC sp_GetGlobalVariableValue 'GlobalInt'
EXEC sp_GetGlobalVariableValue 'GlobalVarchar'
EXEC sp_GetGlobalVariableValue 'GlobalBinary'

GO
-- update value in master
EXEC sp_SetGlobalVariableValue 'GlobalVarchar', 'New varchar value'

USE AdventureWorks

EXEC sp_GetGlobalVariableValue 'GlobalDate' 
EXEC sp_GetGlobalVariableValue 'GlobalInt'
EXEC sp_GetGlobalVariableValue 'GlobalVarchar'
EXEC sp_GetGlobalVariableValue 'GlobalBinary'

-- update value in AdventureWorks
EXEC sp_SetGlobalVariableValue 'GlobalInt', 6

EXEC sp_GetGlobalVariableValue 'GlobalDate' 
EXEC sp_GetGlobalVariableValue 'GlobalInt'
EXEC sp_GetGlobalVariableValue 'GlobalVarchar'
EXEC sp_GetGlobalVariableValue 'GlobalBinary'
0 голосов
/ 21 января 2013

Вы можете использовать временную таблицу. Мой сценарий заключается в том, что когда данные обновляются с помощью известного процесса, он добавляет примечание к таблице аудита, в котором говорится, что «это было сделано специально».

Когда запускается этот процесс, он вставляет одно значение в #auditnote (это временная таблица, которую я создаю на лету).

Триггер проверяет эту таблицу. Если он существует, он снимает записку и помещает ее в таблицу аудита.

Если это не так, то это касается бизнеса.

Я смотрел на использование переменной @@, но хитрость в том, чтобы определить, существует ли переменная. Я не вижу пути.

Пример: Хранимая процедура:

SELECT 'Alrighty Then' AS NOTE INTO #AuditNote

Trigger:

    DECLARE @noteExists BIT
    DECLARE @note NVARCHAR(500)
    IF OBJECT_ID('tempdb..#auditnote') IS NOT NULL
    BEGIN
        SELECT 
            TOP (1)
            @noteExists = 1,
            @note = Note
        FROM 
            #auditNote
    END ELSE BEGIN
        SELECT @noteExists = 0
    END

-- do something with the note

    IF @noteExists = 1
    BEGIN
        DROP TABLE #AuditNotes
    END

Я использую @noteExists вместо проверки на ноль, потому что кто-то может вставить ноль в качестве примечания, поэтому мы не знаем, означает ли ноль TABLE, НЕ СУЩЕСТВУЮЩИЙ или NOTE NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...