Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

क्या आप डेटाबेस में साझा तालिका प्रकार की अनुमति देने के लिए एक सीएलआर यूडीटी बना सकते हैं?

क्या तुम इसके बारे में पक्के हो? उपयोगकर्ता-परिभाषित प्रकार डेटाबेस-स्तरीय ऑब्जेक्ट हैं, सर्वर-स्तर नहीं। उन्हें "सार्वभौमिक रूप से" एक्सेस करने का एकमात्र तरीका असेंबली को प्रत्येक डेटाबेस में लोड करना और प्रत्येक डेटाबेस में उपयोगकर्ता-परिभाषित प्रकार बनाना है। MSDN दस्तावेज़ में SQL सर्वर में उपयोगकर्ता-निर्धारित प्रकारों को पंजीकृत करने के लिए इतना ही कहा गया है :

अपने विशिष्ट प्रश्नों के उत्तर देने के लिए:

डेटाबेस में न तो तालिका प्रकार और न ही उपयोगकर्ता-परिभाषित प्रकार पहुंच योग्य हैं, जैसा कि MSDN दस्तावेज़ में ऊपर उल्लेख किया गया है, CLR UDTs के लिए एक मामले में स्वीकार करें।

कार्यान्वयन के केवल दो अलग-अलग साधनों (यानी टी-एसक्यूएल यूडीएफ/संग्रहीत प्रक्रिया बनाम एसक्यूएलसीएलआर यूडीएफ/संग्रहीत प्रक्रिया) होने के विरोध में आप ऐसा नहीं कर सकते क्योंकि वे दो अलग-अलग चीजें हैं (यानी एक "प्रकार" बनाम "तालिका प्रकार")।

संपादित करें:

विशुद्ध रूप से तकनीकी स्तर पर, यह है डेटाबेस में प्रकार (तालिका प्रकार और उपयोगकर्ता-परिभाषित प्रकार) का उपयोग करना संभव है, लेकिन केवल वर्तमान संदर्भ को 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर भूगोल डेटाटाइप लाइन पर निकटतम बिंदु

  2. SQL Server 2000 में उपलब्ध मैजिक टेबल क्या हैं?

  3. तालिका बनाने के बाद सम्मिलित करते समय अमान्य स्तंभ नाम त्रुटि

  4. QUOTENAME का उपयोग किए बिना SQL सर्वर में सीमांकित पहचानकर्ताओं से बचने का सही तरीका

  5. कैसे ठीक करें "अमान्य वस्तु का नाम 'OPENJSON'।" SQL सर्वर में