मैं String.Format.NET में विधि के समान स्ट्रिंग हेरफेर के लिए T-SQL में एक अंतर्निहित फ़ंक्शन / विस्तारित फ़ंक्शन की तलाश कर रहा हूं ।
जवाबों:
यदि आप SQL Server 2012 और इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं FORMATMESSAGE। जैसे।
DECLARE @s NVARCHAR(50) = 'World';
DECLARE @d INT = 123;
SELECT FORMATMESSAGE('Hello %s, %d', @s, @d)
-- RETURNS 'Hello World, 123'
MSDN से अधिक उदाहरण: FORMATMESSAGE
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');
टिप्पणियाँ:
FORMATMESSAGEएक (हानिरहित) त्रुटि के रूप में सामने आती हैmsg_number।
string.Formatटी-एसक्यूएल में -स्टाइल कार्यक्षमता नहीं है , यह आपके निकटतम है।
xp_sprintf पर एक नज़र डालें । नीचे उदाहरण।
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 char सीमा) के साथ एक मुद्दा मिला, इसलिए एक वैकल्पिक फ़ंक्शन है जिसका आप उपयोग कर सकते हैं:
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)
मैंने string.format कार्यक्षमता की नकल करने के लिए एक उपयोगकर्ता परिभाषित फ़ंक्शन बनाया है। आप इसका उपयोग कर सकते हैं।
एक तरीका है, लेकिन इसकी अपनी सीमाएं हैं। आप FORMATMESSAGE()फ़ंक्शन का उपयोग कर सकते हैं । यह आपको printf()सी में फ़ंक्शन के समान स्वरूपण का उपयोग करके स्ट्रिंग को प्रारूपित करने की अनुमति देता है।
हालांकि, सबसे बड़ी सीमा यह है कि यह केवल sys.messages तालिका में संदेशों के साथ काम करेगा। इसके बारे में यहां एक लेख दिया गया है: microsoft_library_ms186788
यह शर्म की तरह है ऐसा करने का एक आसान तरीका नहीं है, क्योंकि ऐसे समय होते हैं जब आप डेटाबेस में एक स्ट्रिंग / varchar प्रारूपित करना चाहते हैं। उम्मीद है कि आप केवल एक मानक तरीके से एक स्ट्रिंग को प्रारूपित करना चाहते हैं और sys.messagesतालिका का उपयोग कर सकते हैं ।
संयोग से, आप RAISERROR()फ़ंक्शन को बहुत कम गंभीरता के साथ भी उपयोग कर सकते हैं , रिज़रर के लिए प्रलेखन भी ऐसा करने का उल्लेख करते हैं, लेकिन परिणाम केवल मुद्रित होते हैं। इसलिए आप परिणामी मूल्य (जो मुझे समझ में आता है) से कुछ नहीं कर पाएंगे।
सौभाग्य!
FORMATMESSAGE()में धारणा गलत है, हालांकि समझने योग्य है क्योंकि यह अनिर्दिष्ट है लेकिन यह किसी भी स्ट्रिंग को पहले पैरामीटर के रूप में स्वीकार करेगा, इस उत्तर को @ g2server द्वारा देखें ।
कच्चे t-sql स्ट्रिंग हेरफेर के लिए CHARINDEX (), PATINDEX (), REPLACE (), और SUBSTRING () तक सीमित है। लेकिन sql सर्वर 2005 और बाद में आप .Net में चलने वाले उपयोगकर्ता परिभाषित कार्यों को सेट कर सकते हैं, जिसका अर्थ है कि string.format () UDF सेट करना बहुत कठिन नहीं होना चाहिए।
एक और विचार।
हालांकि यह एक सार्वभौमिक समाधान नहीं है - यह सरल है और काम करता है, कम से कम मेरे लिए :)
एक प्लेसहोल्डर {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);
मुझे लगता है कि अंतिम स्थिति की गणना करते समय छोटा सुधार होता है।
यहाँ सही फ़ंक्शन है
**>>**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
यहाँ मेरा संस्करण है। मापदंडों की अधिक संख्या को समायोजित करने के लिए बढ़ाया जा सकता है और प्रकार के आधार पर स्वरूपण का विस्तार कर सकते हैं। वर्तमान में केवल दिनांक और डेटाटाइम प्रकार स्वरूपित हैं।
उदाहरण:
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;
यहाँ मुझे अपने प्रयोगों के साथ बिल्ट-इन का उपयोग करते हुए मिला
FORMATMESSAGE () फ़ंक्शन
sp_addmessage @msgnum=50001,@severity=1,@msgText='Hello %s you are #%d',@replace='replace'
SELECT FORMATMESSAGE(50001, 'Table1', 5)
जब आप sp_addmessage को कॉल करते हैं, तो आपका संदेश टेम्प्लेट सिस्टम टेबल मास्टर.dbo.sysmessages (SQLServer 2000 पर सत्यापित) में संग्रहीत हो जाता है।
आपको स्वयं तालिका से टेम्पलेट स्ट्रिंग्स को जोड़ने और हटाने का प्रबंधन करना चाहिए, जो अजीब है यदि आप वास्तव में चाहते हैं तो परिणाम स्क्रीन पर एक त्वरित संदेश है।
कथिक DV द्वारा प्रदान किया गया समाधान, दिलचस्प लगता है, लेकिन SQL Server 2000 के साथ काम नहीं करता है, इसलिए मैंने इसे थोड़ा बदल दिया है, और इस संस्करण को SQL सर्वर के सभी संस्करणों के साथ काम करना चाहिए:
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
फिलहाल यह वास्तव में मौजूद नहीं है (हालाँकि आप निश्चित रूप से अपना लिख सकते हैं)। इसके लिए एक खुला कनेक्ट बग है: https://connect.microsoft.com/SQLServer/Feedback/Details/3130221 , जिसके इस लेखन में सिर्फ 1 वोट है।
वास्तव में स्ट्रिंग के समान कोई फ़ंक्शन नहीं बनाया गया है। .NET का फ़ंक्शन फ़ंक्शन SQL सर्वर में उपलब्ध है।
SQL सर्वर में एक फ़ंक्शन FORMATMESSAGE () है , लेकिन यह .NET की C नहीं स्ट्रिंग .ormat फ़ंक्शन के प्रिंटफ () फ़ंक्शन के लिए नकल करता है।
SELECT FORMATMESSAGE('This is the %s and this is the %s.', 'first variable', 'second variable') AS Result
बिल्कुल नहीं, लेकिन मैं साधारण बात पर "फिल फैक्टर" (गेडिट?) द्वारा स्ट्रिंग हैंडलिंग (अन्य बातों के अलावा) पर कुछ लेखों की जांच करूंगा ।