স্ট্রিং.ফর্ম্যাট টি-এসকিউএলএর মতো?


90

আমি String.Formatনেট মধ্যে পদ্ধতির অনুরূপ স্ট্রিং ম্যানিপুলেশনের জন্য টি-এসকিউএলে একটি অন্তর্নির্মিত ফাংশন / বর্ধিত ফাংশনটি সন্ধান করছি ।

উত্তর:


71

আপনি যদি এসকিউএল সার্ভার 2012 এবং তার বেশি ব্যবহার করে থাকেন তবে আপনি ব্যবহার করতে পারেন FORMATMESSAGE। যেমন

DECLARE @s NVARCHAR(50) = 'World';
DECLARE @d INT = 123;
SELECT FORMATMESSAGE('Hello %s, %d', @s, @d)
-- RETURNS 'Hello World, 123'

এমএসডিএন থেকে আরও উদাহরণ: ফরমেটসেসেজ

SELECT FORMATMESSAGE('Signed int %i, %d %i, %d, %+i, %+d, %+i, %+d', 5, -5, 50, -50, -11, -11, 11, 11);
SELECT FORMATMESSAGE('Signed int with leading zero %020i', 5);
SELECT FORMATMESSAGE('Signed int with leading zero 0 %020i', -55);
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50);
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal %x, %X, %X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o, %#o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#x, %#X, %#X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Hello %s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %-20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');

মন্তব্য:

  • ২০১২ সালে নথিভুক্ত
  • 2044 টি অক্ষরে সীমাবদ্ধ
  • % চিহ্নটি থেকে বাঁচতে আপনার এটি দ্বিগুণ করতে হবে।
  • আপনি যদি বর্ধিত ইভেন্টগুলিতে ত্রুটিগুলি লগ করছেন তবে কলিংটি FORMATMESSAGE(নিরীহ) ত্রুটি হিসাবে আসে

4
আপনি যদি এসকিউএল 2012 ব্যবহার করে থাকেন তবে উপরোক্ত সমস্ত জটিলতা ছাড়াই আপনি ফরমেট ফাংশনটি ব্যবহার করতে পারেন :)
বিপরীত প্রকৌশলী

4
এর আরও বেশি ভোট হওয়া উচিত! অসাধারণ অনুসন্ধান সর্বদা এড়ানো যায় কারণ ধরে নেওয়া হয়েছে এটি কেবল বিল্ট-ইন-এর সাথেই কাজ করবে msg_number
লঙ্ক্যমার্ট

4
@ ল্যানকিমার্ট, ধাক্কা! আমি সম্মত এই গ্রহণযোগ্য উত্তর হওয়া উচিত: সহজ, অন্তর্নির্মিত এবং দুর্দান্তভাবে কাজ।
রবার্ট Synoradzki

4
@ বিজায়ক এটি কেবলমাত্র নির্দিষ্ট স্থানধারকের নাম গ্রহণ করে, উদাহরণস্বরূপ, স্ট্রিংয়ের জন্য% s, ইনটসের জন্য% i।
g2server

4
@ লস্টমাইলোগিন string.Formatটি-এসকিউএলে কোনও স্টাইল কার্যকারিতা নেই , এটি আপনার কাছের সবচেয়ে কাছের।
ইয়ান কেম্প

53

এক্সপি_স্প্রিন্টফ একবার দেখুন । নীচে উদাহরণ।

DECLARE @ret_string varchar (255)
EXEC xp_sprintf @ret_string OUTPUT, 
    'INSERT INTO %s VALUES (%s, %s)', 'table1', '1', '2'
PRINT @ret_string

ফলাফলটি এরকম দেখাচ্ছে:

INSERT INTO table1 VALUES (1, 2)

এইটির সাহায্যে স্ট্রিংয়ের সর্বাধিক আকার (255 চর সীমা) নিয়ে একটি সমস্যা পেয়েছে তাই আপনি ব্যবহার করতে পারেন এমন একটি বিকল্প ফাংশন রয়েছে :

create function dbo.fnSprintf (@s varchar(MAX), 
                @params varchar(MAX), @separator char(1) = ',')
returns varchar(MAX)
as
begin
declare @p varchar(MAX)
declare @paramlen int

set @params = @params + @separator
set @paramlen = len(@params)
while not @params = ''
begin
    set @p = left(@params+@separator, charindex(@separator, @params)-1)
    set @s = STUFF(@s, charindex('%s', @s), 2, @p)
    set @params = substring(@params, len(@p)+2, @paramlen)
end
return @s
end

উপরের মত একই ফলাফল পেতে আপনি ফাংশনটি নীচের হিসাবে কল করুন:

print dbo.fnSprintf('INSERT INTO %s VALUES (%s, %s)', 'table1,1,2', default)

7
কেবলমাত্র একটি এফওয়াইআই যদি আপনার কোনও প্যারামে কমা থাকে তবে আপনার ভাগ্যের বাইরে। যদি আপনি দুর্ঘটনাক্রমে একটি পাস হয়ে যান তবে আপনার কী ভুল হয়েছে তা নির্ধারণ করতে কিছু ঝামেলা পোহাতে হচ্ছে।
কাইল 12 ই

15

আমি স্ট্রিং.ফর্ম্যাট কার্যকারিতা নকল করতে একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন তৈরি করেছি। তুমি এটা ব্যবহার করতে পারো.

স্ট্রিংফর্মেট-ইন-এসকিএল


আমি এই সমাধানটি পছন্দ করি যেহেতু উত্পাদনে xp_ ফাংশন / এসপি ব্যবহারের বিরুদ্ধে আমার প্রতিক্রিয়া রয়েছে। আমি আপনার কোডটিকে একটি বেস হিসাবে ব্যবহার করেছি এবং ডিলিমিটারটি পাস করার অনুমতি দিয়েছি, যা ডেটাতে কমা ব্যবহারের বিষয়ে কোনও উদ্বেগ দূর করে।
টিম ফ্রিজেন

4

একটি উপায় আছে তবে এর সীমাবদ্ধতা রয়েছে। আপনি FORMATMESSAGE()ফাংশন ব্যবহার করতে পারেন । এটি আপনাকে printf()সি এর ফাংশনের অনুরূপ বিন্যাস ব্যবহার করে একটি স্ট্রিং ফর্ম্যাট করতে দেয়

তবে, সর্বাধিক সীমাবদ্ধতা হ'ল এটি কেবল sys.messages টেবিলের বার্তাগুলি দিয়ে কাজ করবে। এটি সম্পর্কে একটি নিবন্ধ এখানে দেওয়া হয়েছে: মাইক্রোসফ্ট_লিবেরি_এম 186788

এটি লজ্জাজনক এক ধরণের এটি করার সহজ উপায় নেই, কারণ এমন অনেক সময় আছে যখন আপনি ডাটাবেজে স্ট্রিং / বার্চর ফর্ম্যাট করতে চান। আশা করি আপনি কেবল স্ট্রিংকে একটি স্ট্যান্ডার্ড উপায়ে ফর্ম্যাট করতে দেখছেন এবং sys.messagesটেবিলটি ব্যবহার করতে পারবেন ।

কাকতালীয়ভাবে, আপনি RAISERROR()খুব কম তীব্রতার সাথেও ফাংশনটি ব্যবহার করতে পারেন , উত্থাপনকারী জন্য ডকুমেন্টেশন এমনকি এটি করার উল্লেখ করেছে, তবে ফলাফলগুলি কেবল মুদ্রিত হয়। সুতরাং আপনি ফলাফলের মান (যা আমি বুঝতে পারি) এর সাথে কিছু করতে সক্ষম হবেন না।

শুভকামনা!


4
এটি একটি পুরানো উত্তর FORMATMESSAGE()বুঝতে পারছেন তবে অনুমানটি ভুল, যদিও এটি অননুমোদিত তবে এটি যে কোনও স্ট্রিংটিকে প্রথম প্যারামিটার হিসাবে গ্রহণ করবে, @ g2server দ্বারা এই উত্তরটি দেখুন ।
লঙ্ক্যমার্ট

@ ল্যানকিমার্ট আপনি সঠিক - এটি একটি পুরানো উত্তর। স্ট্রিং গ্রহণের ক্ষমতা এসকিউএল ২০১২ অবধি যুক্ত করা হয়নি।
জেজে।

3

কাঁচা t-sql স্ট্রিং ম্যানিপুলেশনের জন্য CHARINDEX (), PATINDEX (), প্রতিস্থাপন (), এবং সাবস্ট্রিং () এর মধ্যে সীমাবদ্ধ। তবে এসকিএল সার্ভার 2005 এর সাথে এবং পরে আপনি। নেট এ চলমান ব্যবহারকারী সংজ্ঞায়িত ফাংশন সেটআপ করতে পারেন, যার অর্থ একটি স্ট্রিং.ফর্ম্যাট () ইউডিএফ সেটআপ করা খুব শক্ত হওয়া উচিত নয়।


2

আরও একটি ধারণা।

যদিও এটি সর্বজনীন সমাধান নয় - এটি সহজ এবং কমপক্ষে আমার পক্ষে কাজ করে :)

এক স্থানধারকের জন্য {0}:

create function dbo.Format1
(
    @String  nvarchar(4000),
    @Param0  sql_variant
)
returns nvarchar(4000)
as
begin
    declare @Null nvarchar(4) = N'NULL';

    return replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));    
end

দুটি স্থানধারীর জন্য {0} এবং {1}:

create function dbo.Format2
(
    @String  nvarchar(4000),
    @Param0  sql_variant,
    @Param1  sql_variant
)
returns nvarchar(4000)
as
begin
    declare @Null nvarchar(4) = N'NULL';

    set @String = replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));
       return     replace(@String, N'{1}', cast(isnull(@Param1, @Null) as nvarchar(4000))); 
end

তিন স্থানধারীর জন্য {0}, {1} এবং {2}:

create function dbo.Format3
(
    @String  nvarchar(4000),
    @Param0  sql_variant,
    @Param1  sql_variant,
    @Param2  sql_variant
)
returns nvarchar(4000)
as
begin
    declare @Null nvarchar(4) = N'NULL';

    set @String = replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));
    set @String = replace(@String, N'{1}', cast(isnull(@Param1, @Null) as nvarchar(4000))); 
       return     replace(@String, N'{2}', cast(isnull(@Param2, @Null) as nvarchar(4000)));
end

এবং তাই ...

এই জাতীয় দৃষ্টিভঙ্গি আমাদের নির্বাচনগুলি বিবৃতিতে এবং nvarchar, সংখ্যা, বিট এবং তারিখের সময় ডেটাটাইপগুলির পরামিতি সহ এই ফাংশনগুলি ব্যবহার করতে দেয়।

উদাহরণ স্বরূপ:

declare @Param0 nvarchar(10) = N'IPSUM' ,
        @Param1 int          = 1234567  ,
        @Param2 datetime2(0) = getdate();

select dbo.Format3(N'Lorem {0} dolor, {1} elit at {2}', @Param0, @Param1, @Param2);  

1

আমি মনে করি শেষ অবস্থানের গণনা করার সময় ছোট সংশোধন আছে।

এখানে সঠিক ফাংশন

**>>**IF OBJECT_ID( N'[dbo].[FormatString]', 'FN' ) IS NOT NULL
DROP FUNCTION [dbo].[FormatString]
GO
/***************************************************
Object Name : FormatString
Purpose : Returns the formatted string.
Original Author : Karthik D V http://stringformat-in-sql.blogspot.com/
Sample Call:
SELECT dbo.FormatString ( N'Format {0} {1} {2} {0}', N'1,2,3' )
*******************************************/
CREATE FUNCTION [dbo].[FormatString](
    @Format NVARCHAR(4000) ,
    @Parameters NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
    --DECLARE @Format NVARCHAR(4000), @Parameters NVARCHAR(4000) select @format='{0}{1}', @Parameters='hello,world'
    DECLARE @Message NVARCHAR(400), @Delimiter CHAR(1)
    DECLARE @ParamTable TABLE ( ID INT IDENTITY(0,1), Parameter VARCHAR(1000) )
    Declare @startPos int, @endPos int
    SELECT @Message = @Format, @Delimiter = ','**>>**

    --handle first parameter
     set @endPos=CHARINDEX(@Delimiter,@Parameters)
    if (@endPos=0 and @Parameters is not null) --there is only one parameter
        insert into @ParamTable (Parameter) values(@Parameters)
    else begin
        insert into @ParamTable (Parameter) select substring(@Parameters,0,@endPos)
    end

    while @endPos>0
    Begin
        --insert a row for each parameter in the 
        set @startPos = @endPos + LEN(@Delimiter)
        set @endPos = CHARINDEX(@Delimiter,@Parameters, @startPos)
        if (@endPos>0)
            insert into @ParamTable (Parameter) 
                select substring(@Parameters,@startPos,@endPos - @startPos)
            else
                insert into @ParamTable (Parameter) 
                select substring(@Parameters,@startPos,4000)            
    End

    UPDATE @ParamTable SET @Message = 
        REPLACE ( @Message, '{'+CONVERT(VARCHAR,ID) + '}', Parameter )
    RETURN @Message
END
Go
grant execute,references on dbo.formatString to public 

1

এখানে আমার সংস্করণ। আরও সংখ্যক প্যারামিটার যুক্ত করতে বাড়ানো যেতে পারে এবং টাইপের উপর ভিত্তি করে ফর্ম্যাটিং বাড়ানো যেতে পারে। বর্তমানে কেবল তারিখ এবং তারিখের টাইমগুলি ফর্ম্যাট করা আছে।

উদাহরণ:

select dbo.FormatString('some string %s some int %s date %s','"abcd"',100,cast(getdate() as date),DEFAULT,DEFAULT)
select dbo.FormatString('some string %s some int %s date time %s','"abcd"',100,getdate(),DEFAULT,DEFAULT)

আউটপুট:

some string "abcd" some int 100 date 29-Apr-2017
some string "abcd" some int 100 date time 29-Apr-2017 19:40

কার্যাদি:

create function dbo.FormatValue(@param sql_variant)
returns nvarchar(100)
begin
/*
Tejasvi Hegde, 29-April-2017
Can extend formatting here.
*/
    declare @result nvarchar(100)

    if (SQL_VARIANT_PROPERTY(@param,'BaseType') in ('date'))
    begin
       select @result = REPLACE(CONVERT(CHAR(11), @param, 106), ' ', '-')
    end
    else  if (SQL_VARIANT_PROPERTY(@param,'BaseType') in ('datetime','datetime2'))
    begin
       select @result = REPLACE(CONVERT(CHAR(11), @param, 106), ' ', '-')+' '+CONVERT(VARCHAR(5),@param,108)
    end
    else
    begin
       select @result = cast(@param as nvarchar(100))
    end
    return @result

/*
BaseType:
bigint
binary
char
date
datetime
datetime2
datetimeoffset
decimal
float
int
money
nchar
numeric
nvarchar
real
smalldatetime
smallint
smallmoney
time
tinyint
uniqueidentifier
varbinary
varchar
*/   

end;


create function dbo.FormatString(
    @format nvarchar(4000)
    ,@param1 sql_variant = null
    ,@param2 sql_variant = null
    ,@param3 sql_variant = null
    ,@param4 sql_variant = null
    ,@param5 sql_variant = null
    )
returns nvarchar(4000)
begin
/*
Tejasvi Hegde, 29-April-2017

select dbo.FormatString('some string value %s some int %s date %s','"abcd"',100,cast(getdate() as date),DEFAULT,DEFAULT)
select dbo.FormatString('some string value %s some int %s date time %s','"abcd"',100,getdate(),DEFAULT,DEFAULT)
*/

    declare @result nvarchar(4000)

    select @param1 = dbo.formatValue(@param1)
    ,@param2 = dbo.formatValue(@param2)
    ,@param3 = dbo.formatValue(@param3)
    ,@param4 = dbo.formatValue(@param4)
    ,@param5 = dbo.formatValue(@param5)

    select @param2 = cast(@param2 as nvarchar)
    EXEC xp_sprintf @result OUTPUT,@format , @param1, @param2, @param3, @param4, @param5

    return @result

end;

এসকিউএল সার্ভার ২০০+ এর জন্য সহজ উত্তর। ইনপুটগুলি পৃথক পরামিতি হিসাবে রাখে। এক্সপি_স্প্রিন্ট ফাংশন ব্যবহার করে এবং সহজেই প্রসারিত করা যায়। এক্সপি_স্প্রিন্টফ - ডকস.মাইক্রোসফটকম
জেফ লুইস

0

অন্তর্নির্মিতটি ব্যবহার করে আমার পরীক্ষাগুলি দিয়ে আমি যা পেয়েছি তা এখানে

ফরমেটসেস () ফাংশন

sp_addmessage @msgnum=50001,@severity=1,@msgText='Hello %s you are #%d',@replace='replace'
SELECT FORMATMESSAGE(50001, 'Table1', 5)

আপনি যখন sp_addmessage কল করেন তখন আপনার বার্তা টেম্পলেটটি সিস্টেম টেবিলের মাস্টার.ডবো.সাইমেসেজগুলিতে জমা হয় (এসকিউএল সার্ভার 2000 এ যাচাই করা হয়)।

আপনাকে অবশ্যই টেবিল থেকে টেমপ্লেট স্ট্রিংগুলি সংযোজন এবং অপসারণের ব্যবস্থা করতে হবে, আপনি যদি সত্যিই চান সমস্ত ফলাফলের স্ক্রিনে একটি দ্রুত বার্তা আউটপুট করে দেয় তবে এটি বিশ্রী হয়।

কাঠিক ডিভি প্রদত্ত সমাধানটি আকর্ষণীয় দেখায় তবে এসকিউএল সার্ভার 2000 এর সাথে কাজ করে না, তাই আমি এটিকে কিছুটা পরিবর্তন করেছি এবং এই সংস্করণটি এসকিউএল সার্ভারের সমস্ত সংস্করণের সাথে কাজ করা উচিত:

IF OBJECT_ID( N'[dbo].[FormatString]', 'FN' ) IS NOT NULL
    DROP FUNCTION [dbo].[FormatString]
GO
/***************************************************
Object Name : FormatString
Purpose : Returns the formatted string.
Original Author : Karthik D V http://stringformat-in-sql.blogspot.com/
Sample Call:
SELECT dbo.FormatString ( N'Format {0} {1} {2} {0}', N'1,2,3' )
*******************************************/
CREATE FUNCTION [dbo].[FormatString](
@Format NVARCHAR(4000) ,
@Parameters NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
    --DECLARE @Format NVARCHAR(4000), @Parameters NVARCHAR(4000) select @format='{0}{1}', @Parameters='hello,world'
    DECLARE @Message NVARCHAR(400), @Delimiter CHAR(1)
    DECLARE @ParamTable TABLE ( ID INT IDENTITY(0,1), Parameter VARCHAR(1000) )
    Declare @startPos int, @endPos int
    SELECT @Message = @Format, @Delimiter = ','

    --handle first parameter
     set @endPos=CHARINDEX(@Delimiter,@Parameters)
    if (@endPos=0 and @Parameters is not null) --there is only one parameter
        insert into @ParamTable (Parameter) values(@Parameters)
    else begin
        insert into @ParamTable (Parameter) select substring(@Parameters,0,@endPos)
    end

    while @endPos>0
    Begin
        --insert a row for each parameter in the 
        set @startPos = @endPos + LEN(@Delimiter)
        set @endPos = CHARINDEX(@Delimiter,@Parameters, @startPos)
        if (@endPos>0)
            insert into @ParamTable (Parameter) select substring(@Parameters,@startPos,@endPos)
        else
            insert into @ParamTable (Parameter) select substring(@Parameters,@startPos,4000)            
    End

    UPDATE @ParamTable SET @Message = REPLACE ( @Message, '{'+CONVERT(VARCHAR,ID) + '}', Parameter )
    RETURN @Message
END
Go
    grant execute,references on dbo.formatString to public

ব্যবহার:

print dbo.formatString('hello {0}... you are {1}','world,good')
--result: hello world... you are good


-1

প্রকৃতপক্ষে স্ট্রিংয়ের মতো ফাংশনটিতে কোনও বিল্ট নেই N

এসকিউএল সার্ভারে ফর্ম্যাটস () ফাংশন রয়েছে তবে এটি স্ট্রিং নয় সি এর প্রিন্টফ () ফাংশনটির নকল করে।

SELECT FORMATMESSAGE('This is the %s and this is the %s.', 'first variable', 'second variable') AS Result

-2

ঠিক নয়, তবে আমি সরল আলাপে "ফিল ফ্যাক্টর" (জিডডিট?) দ্বারা স্ট্রিং হ্যান্ডলিংয়ের (অন্যান্য জিনিসগুলির মধ্যে) কিছু নিবন্ধগুলি পরীক্ষা করে দেখব।


-3

এটি খারাপ পদ্ধতির। আপনার সমাবেশ অ্যাসোসিয়েশন ডেল এর সাথে কাজ করা উচিত, এতে আরও ভাল পারফরম্যান্সের জন্য আপনার জন্য একই কাজ করা উচিত।

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