প্রশ্নটি থেকে কয়েক বছর দেরীতে, তবে কিছু দ্রুত এবং নোংরা কোড উত্পন্ন করার জন্য আমার এর মতো কিছু দরকার ছিল something আমি বিশ্বাস করি যেহেতু অন্যেরা বলেছেন যে টেম্প টেবিলটি সামনের দিকে সংজ্ঞায়িত করা আরও সহজ তবে এই পদ্ধতিটি সাধারণ সঞ্চিত প্রক্রিয়া প্রশ্নাবলী বা এসকিএল স্ট্যাটাসের জন্য কাজ করা উচিত।
এটি কিছুটা বিশৃঙ্খলাযুক্ত হবে তবে এটি এখানে অবদানকারীদের কাছ থেকে bণ গ্রহণের পাশাপাশি ডিবিএ স্ট্যাক এক্সচেঞ্জের পল হোয়াইটের সমাধান সংগ্রহের পদ্ধতি ফলাফল কলামের ধরণের পান । আবার এই পদ্ধতির পুনরাবৃত্তি করার জন্য এবং উদাহরণটি একাধিক ব্যবহারকারীর পরিবেশে প্রক্রিয়াগুলির জন্য ডিজাইন করা হয়নি। এক্ষেত্রে একটি কোড জেনারেশন টেমপ্লেট প্রক্রিয়া দ্বারা রেফারেন্সের জন্য একটি টেম্পল সংজ্ঞা একটি বিশ্বব্যাপী টেম্প টেবিলে স্বল্প সময়ের জন্য সেট করা হচ্ছে।
আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি তাই ক্যাভ্যাট থাকতে পারে যাতে আপনি পল হোয়াইটের উত্তরের এমএসডিএন লিঙ্কে যেতে চাইতে পারেন। এটি এসকিউএল 2012 এবং তার চেয়েও বেশি ক্ষেত্রে প্রযোজ্য।
প্রথমে সঞ্চিত প্রক্রিয়াটি sp_describe_first_result_set ব্যবহার করুন যা ওরাকলের বর্ণনার সাথে সাদৃশ্যপূর্ণ।
এটি প্রথম ফলাফলের প্রথম সারির মূল্যায়ন করবে যাতে আপনার সঞ্চিত পদ্ধতি বা বিবৃতিটি একাধিক কোয়েরি প্রদান করে তবে এটি কেবল প্রথম ফলাফলের বর্ণনা দেবে।
টেম্প টেবিল সংজ্ঞা তৈরি করতে বেছে নেওয়া একটি একক ক্ষেত্র প্রত্যাবর্তনকারী কার্যগুলিকে ভাঙ্গার জন্য আমি একটি সঞ্চিত সংগ্রহ তৈরি করেছি।
CREATE OR ALTER PROCEDURE [dbo].[sp_GetTableDefinitionFromSqlBatch_DescribeFirstResultSet]
(
@sql NVARCHAR(4000)
,@table_name VARCHAR(100)
,@TableDefinition NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @TempTableDefinition NVARCHAR(MAX)
DECLARE @NewLine NVARCHAR(4) = CHAR(13)+CHAR(10)
DECLARE @ResultDefinition TABLE ( --The View Definition per MSDN
is_hidden bit NOT NULL
, column_ordinal int NOT NULL
, [name] sysname NULL
, is_nullable bit NOT NULL
, system_type_id int NOT NULL
, system_type_name nvarchar(256) NULL
, max_length smallint NOT NULL
, [precision] tinyint NOT NULL
, scale tinyint NOT NULL
, collation_name sysname NULL
, user_type_id int NULL
, user_type_database sysname NULL
, user_type_schema sysname NULL
, user_type_name sysname NULL
, assembly_qualified_type_name nvarchar(4000)
, xml_collection_id int NULL
, xml_collection_database sysname NULL
, xml_collection_schema sysname NULL
, xml_collection_name sysname NULL
, is_xml_document bit NOT NULL
, is_case_sensitive bit NOT NULL
, is_fixed_length_clr_type bit NOT NULL
, source_server sysname NULL
, source_database sysname NULL
, source_schema sysname NULL
, source_table sysname NULL
, source_column sysname NULL
, is_identity_column bit NULL
, is_part_of_unique_key bit NULL
, is_updateable bit NULL
, is_computed_column bit NULL
, is_sparse_column_set bit NULL
, ordinal_in_order_by_list smallint NULL
, order_by_is_descending smallint NULL
, order_by_list_length smallint NULL
, tds_type_id int NOT NULL
, tds_length int NOT NULL
, tds_collation_id int NULL
, tds_collation_sort_id tinyint NULL
)
--Insert the description into table variable
INSERT @ResultDefinition
EXEC sp_describe_first_result_set @sql
--Now Build the string to create the table via union select statement
;WITH STMT AS (
SELECT N'CREATE TABLE ' + @table_name + N' (' AS TextVal
UNION ALL
SELECT
CONCAT(
CASE column_ordinal
WHEN 1 THEN ' ' ELSE ' , ' END --Determines if comma should precede
, QUOTENAME([name]) , ' ', system_type_name -- Column Name and SQL TYPE
,CASE is_nullable
WHEN 0 THEN ' NOT NULL' ELSE ' NULL' END --NULLABLE CONSTRAINT
) AS TextVal
FROM @ResultDefinition WHERE is_hidden = 0 -- May not be needed
UNION ALL
SELECT N');' + @NewLine
)
--Now Combine the rows to a single String
SELECT @TempTableDefinition = COALESCE (@TempTableDefinition + @NewLine + TextVal, TextVal) FROM STMT
SELECT @TableDefinition = @TempTableDefinition
END
কনড্রামটি হ'ল আপনাকে একটি গ্লোবাল টেবিল ব্যবহার করা দরকার, তবে আপনাকে এটিকে পর্যাপ্ত পরিমাণে অনন্য করে তুলতে হবে যাতে কোনও সংঘর্ষের চিন্তা না করেই আপনি প্রায়শই ড্রপ এবং তৈরি করতে পারেন।
উদাহরণস্বরূপ আমি হাইফেনগুলিকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন করে বিশ্বব্যাপী ভেরিয়েবলের জন্য একটি গাইড (FE264BF5_9C32_438F_8462_8A5DC8DEE49E) ব্যবহার করেছি
DECLARE @sql NVARCHAR(4000) = N'SELECT @@SERVERNAME as ServerName, GETDATE() AS Today;'
DECLARE @GlobalTempTable VARCHAR(100) = N'##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable'
--@sql can be a stored procedure name like dbo.foo without parameters
DECLARE @TableDef NVARCHAR(MAX)
DROP TABLE IF EXISTS #MyTempTable
DROP TABLE IF EXISTS ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
EXEC [dbo].[sp_GetTableDefinitionFromSqlBatch_DescribeFirstResultSet]
@sql, @GlobalTempTable, @TableDef OUTPUT
--Creates the global table ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
EXEC sp_executesql @TableDef
--Now Call the stored procedure, SQL Statement with Params etc.
INSERT ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
EXEC sp_executesql @sql
--Select the results into your undefined Temp Table from the Global Table
SELECT *
INTO #MyTempTable
FROM ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
SELECT * FROM #MyTempTable
DROP TABLE IF EXISTS #MyTempTable
DROP TABLE IF EXISTS ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
আবার, আমি এটি কেবলমাত্র সঞ্চিত প্রক্রিয়া প্রশ্নাগুলি এবং সাধারণ প্রশ্নের সাথে পরীক্ষা করেছি যাতে আপনার মাইলেজটি ভিন্ন হতে পারে। আশা করি এটি কাউকে সাহায্য করবে।