संग्रहीत कार्यविधि के परिणाम सेट से कॉलम का चयन करें


448

मेरे पास एक संग्रहीत प्रक्रिया है जो 80 कॉलम और 300 पंक्तियों को लौटाती है। मैं उन कॉलमों में से 2 का चयन करने के लिए लिखना चाहता हूं। कुछ इस तरह

SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'

जब मैंने उपरोक्त सिंटैक्स का उपयोग किया तो मुझे त्रुटि मिली:

"अमान्य कॉलम नाम"।

मुझे पता है कि सबसे आसान समाधान संग्रहित प्रक्रिया को बदलना होगा, लेकिन मैंने इसे नहीं लिखा, और मैं इसे बदल नहीं सकता।

क्या मुझे जो चाहिए वो करने का कोई तरीका है?

  • मैं परिणामों को डालने के लिए एक अस्थायी तालिका बना सकता हूं, लेकिन क्योंकि 80 स्तंभ हैं इसलिए मुझे केवल 2 कॉलम प्राप्त करने के लिए 80 कॉलम की अस्थायी तालिका बनाने की आवश्यकता होगी। मैं उन सभी स्तंभों को ट्रैक करने से बचना चाहता था जो वापस आ गए हैं।

  • मैंने WITH SprocResults AS ....मार्क द्वारा सुझाए अनुसार उपयोग करने की कोशिश की , लेकिन मुझे 2 त्रुटियां मिलीं

    कीवर्ड 'EXEC' के पास गलत सिंटैक्स।
    आगे गलत वाक्य रचना ')'।

  • मैंने एक तालिका चर घोषित करने की कोशिश की और मुझे निम्नलिखित त्रुटि मिली

    त्रुटि डालें: स्तंभ नाम या आपूर्ति किए गए मानों की संख्या तालिका परिभाषा से मेल नहीं खाती

  • अगर मैं कोशिश करता
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    हूं तो मुझे त्रुटि मिलती है:

    कीवर्ड 'निष्पादित' के पास गलत सिंटैक्स।


जिज्ञासा से बाहर, यह क्वेरी काम करती है: चयन करें * EXEC MyStoredProc 'param1', 'param2' से, यदि ऐसा है, तो परिणाम सेट में कौन-से कॉलम नाम प्रदर्शित होते हैं, और क्या आप अपनी चयनित सूची में उन स्तंभ नामों का उपयोग कर सकते हैं?
डेव कोस्टा

5
मुझे इसके लिए कभी कोई जवाब नहीं मिला।
रॉसिनी

32
वैसे आपने कभी बहुत महत्वपूर्ण सवाल का जवाब नहीं दिया! आप किस एसक्यूएल प्लेटफॉर्म के बारे में पूछ रहे हैं? MySQL, Microsoft SQL Server, Oracle इत्यादि, यह मुझे ऐसा लगता है जैसे यह SQL Server है, लेकिन आपको लोगों को बताने की आवश्यकता है या वे आपके प्रश्न का उत्तर मज़बूती से नहीं दे सकते।
JMTyler

6
ठीक है, यह MS-SQL होना चाहिए। EXECMySQL कीवर्ड नहीं है (MySQL समतुल्य तैयार स्टेटमेंट है )। हालांकि मैं MySQL के लिए जवाब जानना चाहता हूं, लक्ष्य टी-एसक्यूएल के नीचे दिए गए उत्तर। Retagging।
बोब्बोबो

1
मुझे इसके लिए कभी उत्तर नहीं मिला
रॉसिनी

जवाबों:


186

क्या आप क्वेरी को विभाजित कर सकते हैं? संग्रहीत चर परिणामों को तालिका चर या अस्थायी तालिका में सम्मिलित करें। फिर, तालिका चर से 2 कॉलम का चयन करें।

Declare @tablevar table(col1 col1Type,..
insert into @tablevar(col1,..) exec MyStoredProc 'param1', 'param2'

SELECT col1, col2 FROM @tablevar

27
जब आप टेबल की परिभाषा नहीं जानते हैं तो यह भी काम नहीं करता है
इयान बॉयड

उस प्रकार के बारे में नहीं जानते थे। क्या वे अस्थायी तालिकाओं के समान हैं? या यह सख्ती से स्मृति में है?
d -_- b

यह दिलचस्प था: sqlnerd.blogspot.com/2005/09/…
d -_- b

यह ठीक काम करता है अगर टेंपरेचर टेबल में सप्लाई किए गए कॉलम की संख्या स्टोर की गई प्रक्रिया के आउटपुट के समान हो। chagbert।
चगबर्ट

83

यहाँ आपकी समस्या को हल करने के सभी विभिन्न तरीकों की व्याख्या करने वाले एक बहुत अच्छे दस्तावेज़ का लिंक दिया गया है (हालाँकि उनमें से बहुत से का उपयोग नहीं किया जा सकता क्योंकि आप मौजूदा संग्रहीत प्रक्रिया को संशोधित नहीं कर सकते हैं।)

संग्रहीत प्रक्रियाओं के बीच डेटा कैसे साझा करें

गुलज़ार का जवाब काम करेगा (यह ऊपर दिए गए लिंक में प्रलेखित है) लेकिन इसे लिखने में परेशानी होने वाली है (आपको अपने @tablevar (col1, ...) स्टेटमेंट में सभी 80 कॉलम के नाम निर्दिष्ट करने होंगे। और भविष्य में। यदि कोई कॉलम स्कीमा में जोड़ा जाता है या आउटपुट को बदल दिया जाता है तो उसे आपके कोड में अपडेट करना होगा या यह त्रुटि हो जाएगी।


1
मुझे लगता है कि ओपी के लिए ओपेंकी सुझाव उस लिंक के बहुत करीब है जो खोज रहा है।
कोरिन

80
CREATE TABLE #Result
(
  ID int,  Name varchar(500), Revenue money
)
INSERT #Result EXEC RevenueByAdvertiser '1/1/10', '2/1/10'
SELECT * FROM #Result ORDER BY Name
DROP TABLE #Result

स्रोत:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/


@LawfulHacker पवित्र धूम्रपान करता है। आप वर्ष 2014 में SQL Server 2000 पर क्या कर रहे हैं?
जॉन ज़ब्रोस्की

1
विरासत प्रणालियों के साथ बड़े निगम: D
लॉफुलहैकर

39

यह मेरे लिए काम करता है: (अर्थात मुझे केवल 30 कॉलम के 2 कॉलम चाहिए sp_help_job)

SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, 
  'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB''');  

इससे पहले कि यह काम करेगा, मुझे इसे चलाने की जरूरत है:

sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;

.... sys.serversतालिका को अद्यतन करने के लिए। (यानी OPENQUERY के भीतर एक स्व-संदर्भ का उपयोग करना डिफ़ॉल्ट रूप से अक्षम लगता है।)

अपनी सरल आवश्यकता के लिए, मैं लांस के उत्कृष्ट लिंक के OPENQUERY अनुभाग में वर्णित समस्याओं में से किसी में भाग गया ।

रॉसिनी, अगर आपको उन इनपुट मापदंडों को गतिशील रूप से सेट करने की आवश्यकता है, तो OPENQUERY का उपयोग थोड़ा और अधिक हो जाता है:

DECLARE @innerSql varchar(1000);
DECLARE @outerSql varchar(1000);

-- Set up the original stored proc definition.
SET @innerSql = 
'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ;

-- Handle quotes.
SET @innerSql = REPLACE(@innerSql, '''', '''''');

-- Set up the OPENQUERY definition.
SET @outerSql = 
'SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');';

-- Execute.
EXEC (@outerSql);

मैं sp_serveroptionमौजूदा sys.serversआत्म-संदर्भ को सीधे अपडेट करने के लिए उपयोग करने के बीच अंतर (यदि कोई हो) के बारे में सुनिश्चित नहीं हूं , बनाम sp_addlinkedserverडुप्लिकेट / उपनाम बनाने के लिए (जैसा कि लांस के लिंक में वर्णित है)।

नोट 1: मैं OPENROWSET से अधिक पसंद करता हूं, यह देखते हुए कि OPENQUERY को खरीद के भीतर कनेक्शन-स्ट्रिंग परिभाषा की आवश्यकता नहीं है।

नोट 2: यह सब कहने के बाद: आम तौर पर मैं सिर्फ INSERT का उपयोग करेगा ... EXEC :) हां, यह 10 मिनट अतिरिक्त टाइपिंग है, लेकिन अगर मैं इसकी मदद कर सकता हूं, तो मैं इसके साथ घबराना पसंद नहीं करूंगा:
(ए) उद्धरण के भीतर उद्धरण उद्धरण, और
(बी) sys तालिकाओं, और / या डरपोक स्व-संदर्भित लिंक किए गए सर्वर सेटअप (यानी इन के लिए, मुझे अपने मामले को हमारे सभी शक्तिशाली डीबीए से विनती करने की आवश्यकता है :)

हालांकि इस उदाहरण में, मैं एक INSERT का उपयोग नहीं कर सका ... EXEC निर्माण, जैसा sp_help_jobकि पहले से ही एक का उपयोग कर रहा है। ("एक INSERT EXEC कथन को नेस्टेड नहीं किया जा सकता है।")


3
मैंने डायनामिक-एसक्यूएल-
दैट

मुझे यह जांचने की आवश्यकता है कि क्या नौकरी समाप्त हो गई है। "एक INSERT EXEC कथन को नेस्टेड नहीं किया जा सकता है"। मुझे आपसे Microsoft से नफरत है।
एलेक्सकोवेल्स्की 16

11

इसे प्राप्त करने के लिए, पहले आप #test_tableनीचे जैसा बनाएं :

create table #test_table(
    col1 int,
    col2 int,
   .
   .
   .
    col80 int
)

अब प्रक्रिया निष्पादित करें और इसमें मूल्य डालें #test_table:

insert into #test_table
EXEC MyStoredProc 'param1', 'param2'

अब आप इससे मूल्य प्राप्त करते हैं #test_table:

select col1,col2....,col80 from #test_table

2
क्या टेबल वेरिएबल के बजाय टेम्प टेबल बनाने का फायदा है?
डेव केली

1
सबसे अच्छा समाधान मैं stackoverflow पर पाया! :)
उमर

4
क्या होगा अगर मुझे अन्य संग्रहीत प्रक्रिया से केवल एक कॉलम की आवश्यकता है?
पटेल

11

यदि आप अपनी संग्रहीत प्रक्रिया को संशोधित करने में सक्षम हैं, तो आप आसानी से आवश्यक कॉलम परिभाषाओं को एक पैरामीटर के रूप में रख सकते हैं और एक ऑटो-निर्मित अस्थायी तालिका का उपयोग कर सकते हैं:

CREATE PROCEDURE sp_GetDiffDataExample
      @columnsStatement NVARCHAR(MAX) -- required columns statement (e.g. "field1, field2")
AS
BEGIN
    DECLARE @query NVARCHAR(MAX)
    SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable'
    EXEC sp_executeSql @query
    SELECT * FROM ##TempTable
    DROP TABLE ##TempTable
END

इस मामले में आपको मैन्युअल रूप से एक अस्थायी तालिका बनाने की आवश्यकता नहीं है - यह स्वचालित रूप से बनाई गई है। उम्मीद है की यह मदद करेगा।


## टेबल का उपयोग करते समय सावधान रहें क्योंकि वे सत्रों के बीच साझा किए जाते हैं
eKelvin


क्या यह SQL इंजेक्शन के लिए प्रवण है?
बुशार्ड

11

यह जानना मुश्किल हो सकता है कि यह इतना मुश्किल क्यों है। एक संग्रहीत कार्यविधि केवल पाठ (प्रिंट 'पाठ') को वापस कर सकती है, या कई तालिकाओं को वापस कर सकती है, या किसी भी तालिका को वापस नहीं कर सकती है।

तो ऐसा कुछ SELECT * FROM (exec sp_tables) Table1 काम नहीं करेगा


12
यदि ऐसा होता है, तो SQL सर्वर एक त्रुटि उठाने के लिए स्वतंत्र है। उदाहरण के लिए यदि मैं एक सबक्वेरी लिखता हूं जो एक से अधिक मूल्य देता है। हाँ यह हो सकता है, लेकिन वास्तव में ऐसा नहीं है। और यहां तक ​​कि अगर यह किया: एक त्रुटि को उठाना मुश्किल नहीं है।
इयान बॉयड

8

(एसक्यूएल सर्वर मानकर)

T-SQL में संग्रहीत कार्यविधि के परिणामों के साथ काम करने का एकमात्र तरीका INSERT INTO ... EXECवाक्यविन्यास का उपयोग करना है। यह आपको एक अस्थायी तालिका या एक तालिका चर में सम्मिलित करने का विकल्प देता है और वहां से आपको आवश्यक डेटा का चयन करता है।


1
इसके लिए टेबल की परिभाषा जानना आवश्यक है। उपयोगी नहीं।
त्रिवेंको

8

एक त्वरित हैक एक नया पैरामीटर जोड़ना होगा '@Column_Name'और कॉलिंग फ़ंक्शन को पुनः प्राप्त करने के लिए कॉलम नाम को परिभाषित करना होगा। अपने स्पोक के रिटर्न पार्ट में, यदि आपके पास / या स्टेटमेंट हैं और केवल निर्दिष्ट कॉलम लौटाते हैं, या यदि खाली है - तो सभी वापस कर दें।

CREATE PROCEDURE [dbo].[MySproc]
        @Column_Name AS VARCHAR(50)
AS
BEGIN
    IF (@Column_Name = 'ColumnName1')
        BEGIN
            SELECT @ColumnItem1 as 'ColumnName1'
        END
    ELSE
        BEGIN
            SELECT @ColumnItem1 as 'ColumnName1', @ColumnItem2 as 'ColumnName2', @ColumnItem3 as 'ColumnName3'
        END
END

7

यदि आप डेटा के मैनुअल सत्यापन के लिए ऐसा कर रहे हैं, तो आप LINQPad के साथ ऐसा कर सकते हैं।

LinqPad में डेटाबेस के लिए एक कनेक्शन बनाएँ तो निम्न के समान C # स्टेटमेंट बनाएँ:

DataTable table = MyStoredProc (param1, param2).Tables[0];
(from row in table.AsEnumerable()
 select new
 {
  Col1 = row.Field<string>("col1"),
  Col2 = row.Field<string>("col2"),
 }).Dump();

संदर्भ http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx


7

SQL सर्वर के लिए, मुझे लगता है कि यह ठीक काम करता है:

एक अस्थायी तालिका (या स्थायी तालिका, वास्तव में कोई फर्क नहीं पड़ता) बनाएँ, और संग्रहीत कार्यविधि के विरुद्ध विवरण सम्मिलित करें। SP का परिणाम सेट आपकी तालिका में कॉलम से मेल खाना चाहिए, अन्यथा आपको एक त्रुटि मिलेगी।

यहाँ एक उदाहरण है:

DECLARE @temp TABLE (firstname NVARCHAR(30), lastname nvarchar(50));

INSERT INTO @temp EXEC dbo.GetPersonName @param1,@param2;
-- assumption is that dbo.GetPersonName returns a table with firstname / lastname columns

SELECT * FROM @temp;

बस!


इसके लिए, तालिका परिभाषा की एक प्रति बनाने की आवश्यकता है। क्या इससे बचने का कोई उपाय है?
हार्दिक

7

जैसा कि यह प्रश्न में उल्लेख किया गया है, संग्रहीत कार्यविधि को निष्पादित करने से पहले 80 स्तंभ अस्थायी तालिका को परिभाषित करना कठिन है।

तो इसके आसपास का दूसरा तरीका संग्रहित प्रक्रिया परिणाम सेट के आधार पर तालिका को आबाद करना है।

SELECT * INTO #temp FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;'
                                   ,'EXEC MyStoredProc')

यदि आपको कोई त्रुटि हो रही है, तो आपको निम्नलिखित क्वेरी को निष्पादित करके तदर्थ वितरित प्रश्नों को सक्षम करने की आवश्यकता है।

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

sp_configureकॉन्फ़िगरेशन विकल्प बदलने या RECONFIGUREकथन को चलाने के लिए दोनों मापदंडों के साथ निष्पादित करने के लिए , आपको ALTER SETTINGSसर्वर-स्तर की अनुमति दी जानी चाहिए

अब आप उत्पन्न तालिका से अपने विशिष्ट कॉलम का चयन कर सकते हैं

SELECT col1, col2
FROM #temp

4

इसे इस्तेमाल करे

use mydatabase
create procedure sp_onetwothree as
select 1 as '1', 2 as '2', 3 as '3'
go
SELECT a.[1], a.[2]
FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass',
    'exec mydatabase.dbo.sp_onetwothree') AS a
GO

1
योग्य - उसने नहीं किया। उन्होंने इसे संग्रहीत प्रक्रिया के आह्वान में कोडित किया, जहां यह नेटवर्क सूँघने से डेटाबेस तक पहुंच के बिना आसानी से प्राप्त किया जा सकता है।
मार्टिन मिलन

बहुत आसान है इसे गीथूब से भी बाहर निकालना।
नोमन

3

मुझे पता है कि sp से क्रियान्वयन और अस्थायी तालिका या तालिका चर में सम्मिलित करना एक विकल्प होगा, लेकिन मुझे नहीं लगता कि यह आपकी आवश्यकता है। आपकी आवश्यकता के अनुसार यह नीचे दिया गया कथन काम करना चाहिए:

Declare @sql nvarchar(max)
Set @sql='SELECT   col1, col2 FROM OPENROWSET(''SQLNCLI'', ''Server=(local);uid=test;pwd=test'',
     ''EXEC MyStoredProc ''''param1'''', ''''param2'''''')'
 Exec(@sql)

यदि आपने कनेक्शन पर भरोसा किया है तो नीचे दिए गए क्वेरी स्टेटमेंट का उपयोग करें:

Declare @sql nvarchar(max)
Set @sql='SELECT   col1, col2 FROM OPENROWSET(''SQLNCLI'', ''Server=(local);Trusted_Connection=yes;'',
     ''EXEC MyStoredProc ''''param1'''', ''''param2'''''')'
 Exec(@sql)

यदि आपको उपरोक्त कथन को चलाने में त्रुटि हो रही है तो नीचे इस कथन को चलाएं:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

मुझे उम्मीद है कि यह किसी ऐसे व्यक्ति की मदद करेगा जिसने इस तरह की समस्या का सामना किया होगा। यदि कोई व्यक्ति अस्थायी तालिका या टेबल चर के साथ प्रयास करना चाहे जो इस तरह से होना चाहिए, लेकिन इस परिदृश्य में आपको यह जानना चाहिए कि आपका sp कितने कॉलम में लौट रहा है, तो आपको अस्थायी तालिका या टेबल चर में बहुत अधिक कॉलम बनाना चाहिए:

--for table variable 
Declare @t table(col1 col1Type, col2 col2Type)
insert into @t exec MyStoredProc 'param1', 'param2'
SELECT col1, col2 FROM @t

--for temp table
create table #t(col1 col1Type, col2 col2Type)
insert into #t exec MyStoredProc 'param1', 'param2'
SELECT col1, col2 FROM #t

1

SQL 2012 या उसके बाद वाले किसी भी व्यक्ति के लिए, मैं इसे संग्रहीत प्रक्रियाओं के साथ पूरा करने में सक्षम था जो गतिशील नहीं हैं और हर बार समान कॉलम आउटपुट होते हैं।

सामान्य विचार यह है कि मैं गतिमान तालिका बनाने, सम्मिलित करने, चयन करने और ड्रॉप करने के लिए डायनामिक क्वेरी का निर्माण कर रहा हूं, और यह सब उत्पन्न होने के बाद निष्पादित करता हूं। मैं पहली बार स्तंभ नाम को संग्रहीत प्रक्रिया से कॉलम नाम और प्रकार को प्राप्त करके गतिशील रूप से उत्पन्न करता हूं ।

नोट: बहुत बेहतर, अधिक सार्वभौमिक समाधान हैं जो कोड की कम पंक्तियों के साथ काम करेंगे यदि आप एसपी को अपडेट करने या कॉन्फ़िगरेशन बदलने और उपयोग करने में सक्षम हैं OPENROWSET। यदि आपके पास कोई अन्य तरीका नहीं है, तो नीचे का उपयोग करें।

DECLARE @spName VARCHAR(MAX) = 'MyStoredProc'
DECLARE @tempTableName VARCHAR(MAX) = '#tempTable'

-- might need to update this if your param value is a string and you need to escape quotes
DECLARE @insertCommand VARCHAR(MAX) = 'INSERT INTO ' + @tempTableName + ' EXEC MyStoredProc @param=value'

DECLARE @createTableCommand VARCHAR(MAX)

-- update this to select the columns you want
DECLARE @selectCommand VARCHAR(MAX) = 'SELECT col1, col2 FROM ' + @tempTableName

DECLARE @dropCommand VARCHAR(MAX) = 'DROP TABLE ' + @tempTableName

-- Generate command to create temp table
SELECT @createTableCommand = 'CREATE TABLE ' + @tempTableName + ' (' +
    STUFF
    (
        (
            SELECT ', ' + CONCAT('[', name, ']', ' ', system_type_name)
            FROM sys.dm_exec_describe_first_result_set_for_object
            (
              OBJECT_ID(@spName), 
              NULL
            )
            FOR XML PATH('')
        )
        ,1
        ,1
        ,''
    ) + ')'

EXEC( @createTableCommand + ' '+ @insertCommand + ' ' + @selectCommand + ' ' + @dropCommand)

0

सबसे आसान तरीका अगर आपको केवल एक बार यह करने की आवश्यकता है:

आयात और निर्यात विज़ार्ड में निर्यात करने के लिए निर्यात करें और फिर इस एक्सेल को एक तालिका में आयात करें।


4
एक संग्रहीत खरीद बनाने का पूरा बिंदु पुन: प्रयोज्य है। आपका जवाब पूरी तरह से विरोधाभासी है कि।
deutschZuid

6
मूल पोस्ट में deutschZuid का मुकाबला करने के लिए, वह इस बात का उल्लेख नहीं करता है कि वह इसका पुन: उपयोग करना चाहता है या नहीं या यदि वह किसी संग्रहीत खरीद के परिणामों को देखना चाहता है या नहीं। मार्टिन सही है, यह शायद सबसे आसान तरीका है अगर उसे केवल एक बार करने की आवश्यकता है।
बिशप

0

एक गतिशील दृश्य बनाएं और उससे परिणाम प्राप्त करें ......।

CREATE PROCEDURE dbo.usp_userwise_columns_value
(
    @userid BIGINT
)
AS 
BEGIN
        DECLARE @maincmd NVARCHAR(max);
        DECLARE @columnlist NVARCHAR(max);
        DECLARE @columnname VARCHAR(150);
        DECLARE @nickname VARCHAR(50);

        SET @maincmd = '';
        SET @columnname = '';
        SET @columnlist = '';
        SET @nickname = '';

        DECLARE CUR_COLUMNLIST CURSOR FAST_FORWARD
        FOR
            SELECT columnname , nickname
            FROM dbo.v_userwise_columns 
            WHERE userid = @userid

        OPEN CUR_COLUMNLIST
        IF @@ERROR <> 0
            BEGIN
                ROLLBACK
                RETURN
            END   

        FETCH NEXT FROM CUR_COLUMNLIST
        INTO @columnname, @nickname

        WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @columnlist = @columnlist + @columnname + ','

                FETCH NEXT FROM CUR_COLUMNLIST
                INTO @columnname, @nickname
            END
        CLOSE CUR_COLUMNLIST
        DEALLOCATE CUR_COLUMNLIST  

        IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'v_userwise_columns_value')
            BEGIN
                SET @maincmd = 'CREATE VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END
        ELSE
            BEGIN
                SET @maincmd = 'ALTER VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END

        --PRINT @maincmd
        EXECUTE sp_executesql @maincmd
END

-----------------------------------------------
SELECT * FROM dbo.v_userwise_columns_value

-1

मैं मूल एसपी को काटकर चिपका देता हूं और 2 कॉलमों को छोड़ देता हूं, जो आप चाहते हैं। या। मैं परिणाम सेट वापस लाऊंगा, इसे एक उचित व्यावसायिक ऑब्जेक्ट पर लाऊंगा, फिर LINQ को दो कॉलम से बाहर करूंगा।


1
लोग ऐसा नहीं करते। यह DRY सिद्धांत का उल्लंघन करेगा। जब चीजें बदल जाती हैं, यदि नहीं, तो आपको अब सभी स्थानों पर अपने परिवर्तन को ट्रैक और इनपुट करना होगा।
jriver27
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.