কিভাবে একটি পরিবর্তনশীল মধ্যে sp_executesql ফলাফল পেতে?


178

আমার ডায়ামিক এসকিউএল এর একটি টুকরা রয়েছে যা আমাকে কার্যকর করতে হবে, তারপরে আমার ফলাফলটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে হবে।

আমি জানি আমি ব্যবহার sp_executesqlকরতে পারি তবে এটি কীভাবে করা যায় সে সম্পর্কে স্পষ্ট উদাহরণ খুঁজে পাচ্ছি না।

উত্তর:


253

আপনার যদি OUTPUT প্যারামিটার থাকে তবে আপনি করতে পারেন

DECLARE @retval int   
DECLARE @sSQL nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

DECLARE @tablename nvarchar(50)  
SELECT @tablename = N'products'  

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename;  
SET @ParmDefinition = N'@retvalOUT int OUTPUT';

EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@retval OUTPUT;

SELECT @retval;

তবে আপনি যদি না করেন এবং এসপি সংশোধন করতে না পারেন:

-- Assuming that your SP return 1 value
create table #temptable (ID int null)
insert into #temptable exec mysp 'Value1', 'Value2'
select * from #temptable

সুন্দর নয়, তবে কাজ করে।


আমার এসপি হবে sp_executesql @myQuery
আইডল

1
@retvalOUT=@retval OUTPUT? তৃতীয় প্যারামিটারটি sp_executesqlকি ন্যায়সঙ্গত হওয়া উচিত নয় @retval OUTPUT?
মোহাম্মদ দেহাগান

2
কেবল একটি স্পর্শকাতর প্রশ্ন, একাধিক আউটপুট সম্পর্কে কী? কোয়েরি চেহারা কেমন হবে?
শ্রীবাস্তব

3
@ শ্রীভাস্তেভ রেডি এই উত্তরটি কীভাবে এই উত্সাহ পেতে পারে তা আমি পাই না।
নিশান্তের

2
আমি মনে করি এটি সঠিক:EXEC sp_executesql @sSQL, @ParmDefinition, @retval OUTPUT;
আয়ান

50
DECLARE @tab AS TABLE (col1 VARCHAR(10), col2 varchar(10)) 
INSERT into @tab EXECUTE  sp_executesql N'
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 1 AS col1, 2 AS col2'

SELECT * FROM @tab

আমি আগে এই পদ্ধতি ব্যবহার করেছি। এটি কেবল প্রথমটিতে কাজ করবে বলে মনে হয় insert into @tab। যদি আপনি insert into @tabএকাধিক রান করার চেষ্টা করেন এবং execute sp_executesqlবিভিন্ন স্ক্যুএল দিয়ে, select * from @tabকেবল প্রথম
নির্বাহের

উফফফ, আমার খারাপ। আমার ২ য় নির্বাচনে একটি ত্রুটি হয়েছিল, যার অর্থ এটি শূন্য সারি ফিরে আসছিল। এই পদ্ধতিটি দুর্দান্ত কাজ করে এবং একটি টেম্প টেবিলের প্রয়োজন হয় না!
মাইক কাউজার 6

এটি সেরা উত্তর। যদিও আমার ডায়নামিক এসকিউএল চালানো দরকার, যার অর্থ হল আপনার গতিশীল এসকিউএলকে প্রথমে একটি প্যারামিটারে তৈরি করা দরকার যেমন @ এসকিউএল এনভারচার (255) = এন 'নির্বাচন করুন 20' - তারপরে কেবলমাত্র sl_executeSql এর পরিবর্তে প্যারামিটারটি পাস করতে হবে।
জোশ হ্যারিস

এই সমাধানটি সবচেয়ে সেরা, আমি আরও অনেককে চেষ্টা করেছি এবং এটি কেবল আমার পক্ষে কাজ করেছে। ধন্যবাদ
নিশানথ

40
DECLARE @vi INT
DECLARE @vQuery NVARCHAR(1000)

SET @vQuery = N'SELECT @vi= COUNT(*) FROM <TableName>'

EXEC SP_EXECUTESQL 
        @Query  = @vQuery
      , @Params = N'@vi INT OUTPUT'
      , @vi = @vi OUTPUT

SELECT @vi

8
চলক viOUTPUT এবং viINT এর ঘোষণা কোথায়?
জেসন মারতাজায়া

1
এই আমার জন্য কাজ করে। বেশি ভোট সহ উত্তরটি কার্যকর হয়নি
sh_kamalh

5
@VQuery প্যারামিটারটি VARCHAR নয় NVARCHAR হিসাবে ঘোষণা করা আবশ্যক
ফারজাদ করিমি


3

রিটার্ন মানগুলি সাধারণত কোনও ফলাফল "প্রত্যাবর্তন" করতে ব্যবহৃত হয় না তবে সাফল্য (0) বা ত্রুটি নম্বর (1-65 কে) ফেরত দিতে ব্যবহৃত হয়। উপরের সমস্তগুলি ইঙ্গিত করে যে স্প_এক্সেকটসেস্কএল একটি মান দেয় না, যা সঠিক নয়। sp_executesql সাফল্যের জন্য 0 এবং ব্যর্থতার জন্য অন্য কোনও সংখ্যা ফিরে আসবে।

নীচে, @ আমি 2727 ফিরে আসবে

DECLARE @s NVARCHAR(500)
DECLARE @i INT;
SET @s = 'USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];';
EXEC @i = sys.sp_executesql @s
SELECT @i AS 'Blah'

এসএসএমএস এই এমএসজি 2727, স্তর 11, রাজ্য 1, লাইন 1 প্রদর্শন করবে সূচকটি 'ননএক্সিস্টিটিভ স্ট্যাটিক্সনাম' খুঁজে পাচ্ছে না।


2

@ ভ্যালু টেবিল টেবিল (মান ভ্রচার (100)) ঘোষণা করুন

                    SELECT @sql = N'SELECT SRS_SizeSetDetails.'+@COLUMN_NAME+' FROM SRS_SizeSetDetails WHERE FSizeID = '''+@FSizeID+''' AND SRS_SizeSetID = '''+@SRS_SizeSetID+'''';

                    INSERT INTO @ValueTable
                    EXEC sp_executesql @sql;

                    SET @Value='';

                    SET @Value = (SELECT TOP 1  Value FROM @ValueTable)

                    DELETE FROM @ValueTable

2

আপনি যদি 1 টির বেশি মান ফেরত চান তবে এটি ব্যবহার করুন:

DECLARE @sqlstatement2      NVARCHAR(MAX);
DECLARE @retText            NVARCHAR(MAX);  
DECLARE @ParmDefinition     NVARCHAR(MAX);
DECLARE @retIndex           INT = 0;

SELECT @sqlstatement = 'SELECT @retIndexOUT=column1 @retTextOUT=column2 FROM XXX WHERE bla bla';

SET @ParmDefinition = N'@retIndexOUT INT OUTPUT, @retTextOUT NVARCHAR(MAX) OUTPUT';

exec sp_executesql @sqlstatement, @ParmDefinition, @retIndexOUT=@retIndex OUTPUT, @retTextOUT=@retText OUTPUT;

প্রত্যাবর্তিত মানগুলি @retIndex এবং @retText এ রয়েছে


1

আপনি চেষ্টা করতে পারেন এমন কিছু এখানে

DECLARE  @SqlStatement  NVARCHAR(MAX) = ''
       ,@result     XML
       ,@DatabaseName  VARCHAR(100)
       ,@SchemaName    VARCHAR(10)
       ,@ObjectName    VARCHAR(200);

SELECT   @DatabaseName = 'some database'
       ,@SchemaName   = 'some schema'
       ,@ObjectName   = 'some object (Table/View)'

SET @SqlStatement = '
                    SELECT @result = CONVERT(XML,
                                            STUFF( ( SELECT *
                                                     FROM 
                                                       (
                                                          SELECT TOP(100) 
                                                          * 
                                                          FROM ' + QUOTENAME(@DatabaseName) +'.'+ QUOTENAME(@SchemaName) +'.' + QUOTENAME(@ObjectName) + '
                                                       ) AS A1 
                                                    FOR XML PATH(''row''), ELEMENTS, ROOT(''recordset'')
                                                 ), 1, 0, '''')
                                       )
                ';

EXEC sp_executesql @SqlStatement,N'@result XML OUTPUT', @result = @result OUTPUT;

SELECT DISTINCT
    QUOTENAME(r.value('fn:local-name(.)', 'VARCHAR(200)')) AS ColumnName
FROM @result.nodes('//recordset/*/*') AS records(r)
ORDER BY ColumnName

0

এটি অনেক দিন আগে ছিল, তাই এখনও এটির প্রয়োজন আছে কিনা তা নিশ্চিত হন না তবে আপনি পূর্ববর্তী এসকিএল স্টেটমেন্টের সাথে কতগুলি সারি প্রভাবিত হয়েছিল তা দেখতে আপনি @@ ROWCOUNT ভেরিয়েবলটি ব্যবহার করতে পারেন।

এটি সহায়ক যখন উদাহরণস্বরূপ আপনি একটি গতিশীল আপডেট বিবৃতি নির্মাণ করেন এবং এটি এক্সিকিউট দিয়ে চালান। কতগুলি সারি আপডেট হয়েছে তা @@ ROWCOUNT দেখায়।

এখানে সংজ্ঞা দেওয়া হল


0

এটি আমার পক্ষে কাজ করেছে:

DECLARE @SQL NVARCHAR(4000)

DECLARE @tbl Table (
    Id int,
    Account varchar(50),
    Amount int
) 

-- Lots of code to Create my dynamic sql statement

insert into @tbl EXEC sp_executesql @SQL

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