Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Можете ли да създадете CLR UDT, за да позволите споделен тип таблица в базите данни?

Сигурен ли си за това? Дефинираните от потребителя типове са обекти на ниво база данни, а не на ниво сървър. Единственият начин за "универсален" достъп до тях е чрез зареждане на сборката във всяка от базите данни и създаване на дефиниран от потребителя тип във всяка база данни. Това е посочено в документацията на MSDN за Регистриране на дефинирани от потребителя типове в SQL Server :

За да отговорите на вашите конкретни въпроси:

Нито типовете таблици, нито типовете, дефинирани от потребителя, са достъпни в базите данни, приемете в един случай за CLR UDT, както е отбелязано по-горе в документацията на MSDN.

Не можете, тъй като това са две отделни неща (т.е. „Тип“ срещу „Тип таблица“), за разлика от това да са само две различни средства за изпълнение (т.е. T-SQL UDF / Съхранена процедура срещу SQLCLR UDF / Съхранена процедура).

РЕДАКТИРАНЕ:

На чисто техническо ниво, е възможно е да се използват типове (типове таблици и типове, дефинирани от потребителя) в базите данни, но само чрез превключване на текущия контекст чрез USE команда, която може да се използва само в ad hoc / динамичен 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Процесори от серия AMD EPYC 7002 и SQL сървър

  2. Как да конвертирате datetime на персийски в SQL Server

  3. Как да получите всички таблици със или без ограничение на първичния ключ в базата данни на Sql сървър - SQL Server / TSQL урок 59

  4. Възможно ли е клаузата за изход на SQL да върне колона, която не е вмъкната?

  5. Възстановяване на основната база данни на SQL Server