sql >> データベース >  >> RDS >> Sqlserver

CLR UDTを作成して、データベース間で共有テーブルタイプを使用できるようにすることはできますか?

    あなたはこれについて確信を持っていますか?ユーザー定義タイプはデータベースレベルのオブジェクトであり、サーバーレベルではありません。それらに「普遍的に」アクセスする唯一の方法は、アセンブリを各データベースにロードし、各データベースにユーザー定義タイプを作成することです。これは、SQLServerでのユーザー定義型の登録に関するMSDNドキュメントに記載されています。

    特定の質問に答えるには:

    テーブルタイプもユーザー定義タイプもデータベース間でアクセスできません。MSDNドキュメントで前述したように、CLRUDTを1つのケースで受け入れます。

    これらは2つの異なる実装手段(つまり、T-SQLUDF/ストアドプロシージャとSQLCLRUDF/ストアドプロシージャ)ではなく、2つの別個のもの(つまり、「タイプ」と「テーブルタイプ」)であるため、できません。

    編集:

    純粋に技術的なレベルでは、 データベース間でタイプ(テーブルタイプとユーザー定義タイプ)を使用できますが、USEを介して現在のコンテキストを切り替える必要があります。 アドホック/動的SQLでのみ使用できるコマンド。したがって、この使用法は実用的なレベルでの適用が制限されていますが、それでも次の例が示すようにそれは可能です。

    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. MySQLはISO8601日時形式を挿入します

    2. group by inを使用して、行のIDを返します

    3. DatabaseConfigurationAssistantを使用したOracle12cのサンプルスキーマのインストール

    4. PHPはチェックボックスで複数の行を削除します