Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bisakah Anda membuat CLR UDT untuk memungkinkan tipe Tabel bersama di seluruh database?

Apa kau yakin tentang ini? Tipe Buatan Pengguna adalah objek tingkat basis data, bukan tingkat server. Satu-satunya cara untuk mengaksesnya "secara universal" adalah dengan memuat Majelis ke setiap database dan membuat Tipe Buatan Pengguna di setiap database. Ini banyak dinyatakan dalam dokumentasi MSDN untuk Mendaftarkan Jenis Buatan Pengguna di SQL Server :

Untuk menjawab pertanyaan spesifik Anda:

Baik Tipe Tabel maupun Tipe Buatan Pengguna tidak dapat diakses di seluruh basis data, terima dalam satu kasus untuk UDT CLR seperti yang disebutkan di atas dalam dokumentasi MSDN.

Anda tidak bisa karena itu adalah dua hal yang terpisah (yaitu "Jenis" vs "Jenis Tabel") sebagai lawan dari hanya dua cara implementasi yang berbeda (yaitu T-SQL UDF / Stored Proc vs SQLCLR UDF / Stored Proc).

EDIT:

Pada tingkat teknis murni, itu adalah dimungkinkan untuk menggunakan Types (Table Types dan User-Defined Types) di seluruh database, tetapi hanya dengan mengalihkan konteks saat ini melalui USE perintah yang hanya dapat digunakan dalam SQL ad hoc / dinamis. Oleh karena itu, penggunaan ini memiliki penerapan yang terbatas pada tingkat praktis, namun tetap memungkinkan seperti yang ditunjukkan oleh contoh berikut:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengaktifkan izin massal di SQL Server

  2. Menjalankan Pekerjaan Agen Server SQL dari prosedur tersimpan dan mengembalikan hasil pekerjaan

  3. Bagaimana cara melihat konten lengkap kolom teks atau varchar(MAX) di SQL Server 2008 Management Studio?

  4. Bagaimana cara membuat batasan unik yang juga memungkinkan nol?

  5. Hitung jam kerja antara dua tanggal