क्या तुम इसके बारे में पक्के हो? उपयोगकर्ता-परिभाषित प्रकार डेटाबेस-स्तरीय ऑब्जेक्ट हैं, सर्वर-स्तर नहीं। उन्हें "सार्वभौमिक रूप से" एक्सेस करने का एकमात्र तरीका असेंबली को प्रत्येक डेटाबेस में लोड करना और प्रत्येक डेटाबेस में उपयोगकर्ता-परिभाषित प्रकार बनाना है। 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