এসকিউএল সার্ভারে কোনও টেম্প টেবিল তৈরির সহজতম উপায় কী যা কোনও সঞ্চিত পদ্ধতির ফলাফলটি ধরে রাখতে পারে?


50

এসকিউএল সার্ভারের সাথে ডিল করার সময় অনেক সময় আমাকে নীচের মতো কিছু লিখতে হবে।

create table #table_name
(
    column1 int,
    column2 varchar(200)
    ...
)

insert into #table_name
execute some_stored_procedure;

তবে একটি সারণী তৈরি করুন যা সঞ্চিত পদ্ধতির ফলাফল হিসাবে হুবহু সিনট্যাক্সযুক্ত একটি ক্লান্তিকর কাজ। উদাহরণস্বরূপ, sp_hepplubation এর ফলাফলের 48 টি কলাম রয়েছে! এটি করার কোনও সহজ উপায় আছে কিনা তা আমি জানতে চাই।

ধন্যবাদ।


যদি আপনি একটি সংজ্ঞায়িত আউটপুট ফর্ম্যাট চান (এবং আপনি যদি ডিবিএ হন তবে আপনার একটি সংজ্ঞায়িত ফর্ম্যাটটি পছন্দ করা উচিত!), একটি সারণী-মান ইউডিএফ বিবেচনা করুন। দুর্ভাগ্যক্রমে তাদের কিছু গুরুতর সীমাবদ্ধতা রয়েছে, তাই এগুলি সর্বদা বিকল্প নয়।
সমস্ত ট্রেডের জোন

উত্তর:


36

যদি পদ্ধতিটি কেবল একটি ফলাফল সেট ফেরত দেয় এবং অ্যাডহক বিতরণ করা প্রশ্নের বিকল্প সক্ষম হয়।

SELECT * 
INTO #T 
FROM OPENROWSET('SQLNCLI', 
                'Server=(local)\MSSQL2008;Trusted_Connection=yes;',
                 'SET FMTONLY OFF;EXEC sp_who')

অথবা আপনি একটি লুপব্যাক সংযুক্ত সার্ভার সেট আপ করতে পারেন এবং পরিবর্তে এটি ব্যবহার করতে পারেন।

EXEC sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                        @provider = 'SQLNCLI', @datasrc = @@servername

SELECT *
INTO  #T
FROM OPENQUERY(LOCALSERVER, 
               'SET FMTONLY OFF;
               EXEC sp_who')

মানে না SET FMT_ONLY ON?
আন্দ্রেস আগ্রেন

@ আন্ড্রেয়াস - না কারণ আমি ধরে নিয়েছি ধারণাটি হ'ল সঞ্চিত পদ্ধতি আউটপুট থেকে টেবিলটি তৈরি এবং প্রবর্তন করা উভয়ই।
মার্টিন স্মিথ

18

এসকিউএল সার্ভার ২০১২ এবং sys.dm_exec_describe_first_result_setতারপরে, আপনি প্রথম ফলাফল হিসাবে পরে যে ফলাফল সেটটি করছেন তা ধরে নিয়ে আপনি স্থানীয়ভাবে ব্যবহার করতে পারেন :

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += ',' + CHAR(13) + CHAR(10) + CHAR(9)
    + name + ' ' + system_type_name
    FROM sys.dm_exec_describe_first_result_set('sp_who', NULL, 1);

SELECT @sql = N'CREATE TABLE #f
(' + STUFF(@sql, 1, 1, N'') + '
);';

PRINT @sql;

ফলাফল:

CREATE TABLE #f
(
    spid smallint,
    ecid smallint,
    status nchar(30),
    loginame nvarchar(128),
    hostname nchar(128),
    blk char(5),
    dbname nvarchar(128),
    cmd nchar(16),
    request_id int
);

মনে রাখবেন একটি সীমাবদ্ধতা রয়েছে: যদি আপনার সঞ্চিত পদ্ধতি # টিম্প টেবিল তৈরি করে, মেটাডেটা কার্যকারিতা কাজ করে না। এই কারণেই আমি এসপি_হো 2 ব্যবহার করিনি। :-)


হয় SELECT @sql += *expression*সিনট্যাক্স কোথাও নথিভুক্ত? এটি একটি ORDER BYস্থিতিশীল করতে অন্তর্ভুক্ত করা উচিত ?
রস প্রেসার

1
@ রোস হ্যাঁ, এটি এসকিউএল সার্ভার ২০০৮ সালে প্রবর্তিত হয়েছিল এবং এটি এখানে নথিভুক্ত করা হয়েছেORDER BYআসলে পরিচিত হয় এই করতে কম স্থিতিশীল । আপনি যদি ফলাফলগুলি অনুমানযোগ্য ক্রমে দেখতে চান তবে FOR XML PATHএসকিউএল সার্ভারের নতুন পর্যায়ে নতুন সংস্করণ ব্যবহার করুন বা STRING_AGG
অ্যারন বারট্র্যান্ড

1
সামান্য সংশোধন: আপনি পাটিগণিতের সাথে লিঙ্ক করেছেন +=... স্ট্রিংটি এখানে+= নথিভুক্ত করা হয়েছে । কিন্তু তোমাকে ধন্যবাদ!
রস প্রেসার

@ রোস হ্যাঁ, দুঃখিত
অ্যারন বার্ট্র্যান্ড

3

না a

আপনাকে ক্রিয়েট টেবিলটি কার্যকর করতে হবে


1

আমি আমার জন্য টেবিল তৈরি করার জন্য একটি পদ্ধতি লিখব:

CREATE PROCEDURE [dbo].[p_create_table_from_procedure]
    @TABLE_NAME AS NVARCHAR(MAX),
    @PROCEDURE_NAME AS NVARCHAR(MAX)

As
    DECLARE @CREATE_TABLE_QUERY NVARCHAR(MAX) = N'';


    SELECT 
        @CREATE_TABLE_QUERY += ', ' + name + ' ' + UPPER(system_type_name) + CHAR(13) + CHAR(10) + CHAR(9)

    FROM 
        sys.dm_exec_describe_first_result_set(@procedure_name, NULL, 1);


    SELECT 
        @CREATE_TABLE_QUERY = N'CREATE TABLE ' + @table_name + '(' + CHAR(13) + CHAR(10) + CHAR(9) + STUFF(@CREATE_TABLE_QUERY, 1, 1, N'') + ');';

    PRINT @CREATE_TABLE_QUERY;

তারপরে এটিকে কল করুন:

EXEC p_create_table_from_procedure 'YOUR_TABLE_NAME_HERE', 'YOUR_PROCEDURE_NAME_HERE'

দ্রষ্টব্য : আপনার নিজস্ব সঞ্চিত পদ্ধতির নামের সাথে 'YOUR_PROCEDURE_NAME_HERE' প্রতিস্থাপন করুন।

দ্রষ্টব্য : আপনার পছন্দের টেবিলের নামটি দিয়ে YOUR_TABLE_NAME_HERE প্রতিস্থাপন করুন।

উপরের দিক থেকে এই জাতীয় কিছু উত্পন্ন হবে:

CREATE TABLE YOUR_TABLE_NAME_HERE(
     WeekName VARCHAR(40)
    , Line Name VARCHAR(50)
    , TheDate DATETIME
    , ReceivedAll INT
    , Answered INT
    , Abandoned INT
    , Call Length INT
    , WaitTimeAnswer INT
    , WaitTimeAbandon INT
    , PeriodName VARCHAR(10)
    , Week SMALLINT
    , Period SMALLINT
    , Year SMALLINT
    , WeekInPeriod SMALLINT
    , NumWeeksInPeriod SMALLINT
    , WeekendDate DATETIME
    , CRCOperative VARCHAR(100)
    , CallType VARCHAR(20)
    , Charge Time INT
    , SourceNumber VARCHAR(80)
    , DestinationNumber VARCHAR(80)
    , CallStart DATETIME
    , Out of Hours VARCHAR(12)
    , IsWorkingDay BIT
    );

এটি উপরে @ অ্যারোনবার্ট্র্যান্ডের উত্তর থেকে কীভাবে আলাদা?
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.