sql >> Database teknologi >  >> RDS >> Sqlserver

Kan du oprette en CLR UDT for at tillade en delt tabeltype på tværs af databaser?

Er du sikker på dette? Brugerdefinerede typer er objekter på databaseniveau, ikke på serverniveau. Den eneste måde at få adgang til dem "universelt" er ved at indlæse forsamlingen i hver af databaserne og oprette den brugerdefinerede type i hver database. Så meget er angivet i MSDN-dokumentationen for registrering af brugerdefinerede typer i SQL Server :

Sådan besvarer du dine specifikke spørgsmål:

Hverken tabeltyper eller brugerdefinerede typer er tilgængelige på tværs af databaser, accepter i det ene tilfælde for CLR UDT'er som nævnt ovenfor i MSDN-dokumentationen.

Du kan ikke, da det er to separate ting (dvs. en "Type" vs en "Tabeltype") i modsætning til blot at være to forskellige måder at implementere på (dvs. T-SQL UDF / Stored Proc vs SQLCLR UDF / Stored Proc).

EDIT:

På et rent teknisk plan er det muligt at bruge typer (tabeltyper og brugerdefinerede typer) på tværs af databaser, men kun ved at skifte den aktuelle kontekst via USE kommando som kun kan bruges i ad hoc / dynamisk SQL. Derfor har denne brug begrænset anvendelighed på et praktisk niveau, men ikke desto mindre er det stadig muligt, som det følgende eksempel viser:

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. ORACLE SQL:Udfyld manglende datoer

  2. Hvad er forskellen mellem PLSQL Bind-variabler og Host-variabler

  3. NodeJS MySQL:mål forespørgsels eksekveringstid

  4. Forbinder Oracle til PostgreSQL