sql >> Databáze >  >> RDS >> Sqlserver

Můžete vytvořit CLR UDT, abyste umožnili sdílený typ tabulky napříč databázemi?

Jsi si tím jistý? Uživatelsky definované typy jsou objekty na úrovni databáze, nikoli na úrovni serveru. Jediným způsobem, jak k nim „univerzálně“ přistupovat, je načíst shromáždění do každé z databází a v každé databázi vytvořit typ definovaný uživatelem. Tolik je uvedeno v dokumentaci MSDN pro Registrace uživatelem definovaných typů na serveru SQL Server :

Chcete-li odpovědět na vaše konkrétní otázky:

Ani typy tabulek, ani typy definované uživatelem nejsou přístupné napříč databázemi, přijměte v jednom případě pro UDT CLR, jak je uvedeno výše v dokumentaci MSDN.

Nemůžete, protože se jedná o dvě oddělené věci (tj. „Typ“ vs „Typ tabulky“), na rozdíl od toho, že jde pouze o dva různé způsoby implementace (např. T-SQL UDF / Stored Proc vs SQLCLR UDF / Stored Proc).

UPRAVIT:

Na čistě technické úrovni to je možné používat typy (typy tabulek a typy definované uživatelem) napříč databázemi, ale pouze přepnutím aktuálního kontextu pomocí USE příkaz, který je použitelný pouze v ad hoc / dynamickém SQL. Toto použití má tedy omezenou použitelnost na praktické úrovni, ale přesto je stále možné, jak ukazuje následující příklad:

SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET NOCOUNT ON;
GO

USE [msdb];
GO

PRINT 'Creating [GlobalTableDef] Table Type in [msdb]...';
CREATE TYPE dbo.GlobalTableDef
AS TABLE
(
    [ID] INT NOT NULL IDENTITY(17, 22),
    [CreateDate] DATETIME NOT NULL DEFAULT (GETDATE()),
    [Something] NVARCHAR(2000) NULL
);
GO

PRINT 'Creating [TotalBytes] Function in [msdb]...';
GO
CREATE FUNCTION dbo.TotalBytes
(
    @TableToSummarize dbo.GlobalTableDef READONLY
)
RETURNS INT
AS
BEGIN
    DECLARE @TotalBytes INT = 0;

SELECT  @TotalBytes += (4 + 8 + DATALENGTH(COALESCE(tmp.Something, '')))
    FROM    @TableToSummarize tmp;

    RETURN @TotalBytes;
END;
GO

PRINT 'Testing the Table Type and Function...';
DECLARE @TmpTable dbo.GlobalTableDef;
INSERT INTO @TmpTable (Something) VALUES (N'this is a test');
INSERT INTO @TmpTable (Something) VALUES (NULL);
INSERT INTO @TmpTable (Something) VALUES (N'still seems to be a test');

SELECT * FROM @TmpTable;

SELECT dbo.TotalBytes(@TmpTable) AS [TotalBytesUsed];
GO

USE [tempdb];
GO
PRINT 'Creating [TypeTest] Proc in [tempdb]...';
GO

CREATE PROCEDURE dbo.TypeTest
AS
SET NOCOUNT ON;

    SELECT 1 AS [Step], DB_NAME() AS [CurrentDB];

    EXEC('
        SELECT 2 AS [Step], DB_NAME() AS [CurrentDB];
        USE [msdb];
        SELECT 3 AS [Step], DB_NAME() AS [CurrentDB];
        DECLARE @TmpTable dbo.GlobalTableDef;
        USE [tempdb];
        SELECT 4 AS [Step], DB_NAME() AS [CurrentDB];

        -- local query to prove context is tempdb
        SELECT TOP 5 * FROM sys.objects;

        INSERT INTO @TmpTable (Something) VALUES (N''this is a new test'');
        INSERT INTO @TmpTable (Something) VALUES (NULL);
        INSERT INTO @TmpTable (Something) VALUES (N''non-empty value'');
        INSERT INTO @TmpTable (Something) VALUES (NULL);
        INSERT INTO @TmpTable (Something) VALUES (N''woo-hoo!!!!!!!!!!!!!!!'');
        SELECT * FROM @TmpTable;

        SELECT [msdb].dbo.TotalBytes(@TmpTable) AS [TotalBytesUsed];
    ');

GO

USE [master];
GO

SELECT 5 AS [Step], DB_NAME() AS [CurrentDB];
EXEC tempdb.dbo.TypeTest;

--------------------------------

USE [tempdb];
GO
IF (OBJECT_ID(N'tempdb.dbo.TypeTest') IS NOT NULL)
BEGIN
    PRINT 'Dropping [TypeTest] Proc from [tempdb]...';
    DROP PROCEDURE dbo.TypeTest;
END;
GO

USE [msdb];
GO
IF (OBJECT_ID(N'dbo.TotalBytes') IS NOT NULL)
BEGIN
    PRINT 'Dropping [TotalBytes] Function from [msdb]...';
    DROP FUNCTION dbo.TotalBytes;
END;
GO

IF (EXISTS(
        SELECT  *
        FROM    sys.table_types stt
        WHERE   stt.name = N'GlobalTableDef'
    ))
BEGIN
    PRINT 'Dropping [GlobalTableDef] Table Type from [msdb]...';
    DROP TYPE dbo.GlobalTableDef;
END;
GO



  1. Proč to nepřijímá e-mailové adresy s pomlčkou za znakem @?

  2. Nastavte opakující se hodnotu na 0, přičemž první hodnotu ponechte samotnou

  3. Nelze zkompilovat GI 12.1.0.2 a Segmentation Fault

  4. Databáze správce balíčků GI 19c RPM