जवाबों:
यह एसक्यूएल का केवल एक अक्षम्य उपयोग है, चाहे आप इसे कैसे भी करें।
शायद कुछ इस तरह
right('XXXXXXXXXXXX'+ rtrim(@str), @n)
जहाँ X आपका पैडिंग कैरेक्टर है और @n परिणामस्वरूप स्ट्रिंग में वर्णों की संख्या है (यह मानते हुए कि आपको पैडिंग की आवश्यकता है क्योंकि आप एक निश्चित लंबाई के साथ काम कर रहे हैं)।
लेकिन जैसा कि मैंने कहा कि आपको वास्तव में अपने डेटाबेस में ऐसा करने से बचना चाहिए।
RTRIM(@str)हालांकि आपको इसकी आवश्यकता पड़ सकती है यदि इसमें अनुगामी स्थान हो सकते हैं।
मुझे पता है कि यह मूल रूप से 2008 में वापस पूछा गया था, लेकिन SQL सर्वर 2012 के साथ पेश किए गए कुछ नए फ़ंक्शन हैं। FORMAT फ़ंक्शन शून्य से बचे हुए पैडिंग को सरल करता है । यह आपके लिए रूपांतरण भी करेगा:
declare @n as int = 2
select FORMAT(@n, 'd10') as padWithZeros
अपडेट करें:
मैं स्वयं FORMAT फ़ंक्शन की वास्तविक दक्षता का परीक्षण करना चाहता था। AlexCuse के मूल जवाब की तुलना में दक्षता बहुत अच्छी नहीं थी, यह जानकर मुझे बहुत आश्चर्य हुआ । हालाँकि मुझे FORMAT फ़ंक्शन क्लीनर मिला है, यह निष्पादन समय के मामले में बहुत कुशल नहीं है। टैली टेबल जिसका मैंने उपयोग किया है उसके 64,000 रिकॉर्ड हैं। निष्पादन समय दक्षता को इंगित करने के लिए मार्टिन स्मिथ को कुदोस।
SET STATISTICS TIME ON
select FORMAT(N, 'd10') as padWithZeros from Tally
SET STATISTICS TIME OFF
SQL सर्वर निष्पादन समय: CPU समय = 2157 ms, बीता समय = 2696 ms।
SET STATISTICS TIME ON
select right('0000000000'+ rtrim(cast(N as varchar(5))), 10) from Tally
SET STATISTICS TIME OFF
SQL सर्वर निष्पादन समय:
सीपीयू समय = 31 एमएस, बीता हुआ समय = 235 एमएस।
शायद एक ओवर किल मुझे बाएं और दाएं पैड करने के लिए ये यूडीएफ हैं
ALTER Function [dbo].[fsPadLeft](@var varchar(200),@padChar char(1)='0',@len int)
returns varchar(300)
as
Begin
return replicate(@PadChar,@len-Len(@var))+@var
end
और सही करने के लिए
ALTER function [dbo].[fsPadRight](@var varchar(200),@padchar char(1)='0', @len int) returns varchar(201) as
Begin
--select @padChar=' ',@len=200,@var='hello'
return @var+replicate(@PadChar,@len-Len(@var))
end
मुझे यकीन नहीं है कि जो विधि आप दे रहे हैं वह वास्तव में अक्षम है, लेकिन एक वैकल्पिक तरीका है, जब तक कि यह लंबाई या गद्दी चरित्र में लचीला होना जरूरी नहीं है, यह होगा (यह मानते हुए कि आप इसके साथ पैड करना चाहते हैं " 0 "से 10 अक्षर:
DECLARE
@pad_characters VARCHAR(10)
SET @pad_characters = '0000000000'
SELECT RIGHT(@pad_characters + @str, 10)
शायद overkill, मैं अक्सर इस UDF का उपयोग करें:
CREATE FUNCTION [dbo].[f_pad_before](@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1))
RETURNS VARCHAR(255) AS
BEGIN
-- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character
RETURN ltrim(rtrim(
CASE
WHEN LEN(@string) < @desired_length
THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string
ELSE @string
END
))
END
ताकि आप निम्न कार्य कर सकें:
select dbo.f_pad_before('aaa', 10, '_')
यह बाईं ओर पैड करने का एक सरल तरीका है:
REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)
xपैड नंबर कहां है और yपैड कैरेक्टर है।
नमूना:
REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
1है 001।
select right(replicate(@padchar, @len) + @str, @len)
मैं इस एक का उपयोग करें। यह आपको उस लंबाई को निर्धारित करने की अनुमति देता है जिसे आप चाहते हैं कि परिणाम एक डिफॉल्ट पैडिंग कैरेक्टर होने के साथ-साथ यदि प्रदान नहीं किया जाता है। निश्चित रूप से आप जो भी अधिकतम चल रहे हैं उसके लिए इनपुट और आउटपुट की लंबाई को अनुकूलित कर सकते हैं।
/*===============================================================
Author : Joey Morgan
Create date : November 1, 2012
Description : Pads the string @MyStr with the character in
: @PadChar so all results have the same length
================================================================*/
CREATE FUNCTION [dbo].[svfn_AMS_PAD_STRING]
(
@MyStr VARCHAR(25),
@LENGTH INT,
@PadChar CHAR(1) = NULL
)
RETURNS VARCHAR(25)
AS
BEGIN
SET @PadChar = ISNULL(@PadChar, '0');
DECLARE @Result VARCHAR(25);
SELECT
@Result = RIGHT(SUBSTRING(REPLICATE('0', @LENGTH), 1,
(@LENGTH + 1) - LEN(RTRIM(@MyStr)))
+ RTRIM(@MyStr), @LENGTH)
RETURN @Result
END
आपकी माइलेज भिन्न हो सकती है। :-)
जॉय मॉर्गन
प्रोग्रामर / विश्लेषक प्रिंसिपल I
वेलपॉइंट मेडिकेड बिजनेस यूनिट
यहाँ मेरा समाधान है, जो फंसे तार से बचा जाता है और सादे ol 'SQL का उपयोग करता है। @AlexCuse , @Kevin और @Sklivvz को धन्यवाद , जिनके समाधान इस कोड की नींव हैं।
--[@charToPadStringWith] is the character you want to pad the string with.
declare @charToPadStringWith char(1) = 'X';
-- Generate a table of values to test with.
declare @stringValues table (RowId int IDENTITY(1,1) NOT NULL PRIMARY KEY, StringValue varchar(max) NULL);
insert into @stringValues (StringValue) values (null), (''), ('_'), ('A'), ('ABCDE'), ('1234567890');
-- Generate a table to store testing results in.
declare @testingResults table (RowId int IDENTITY(1,1) NOT NULL PRIMARY KEY, StringValue varchar(max) NULL, PaddedStringValue varchar(max) NULL);
-- Get the length of the longest string, then pad all strings based on that length.
declare @maxLengthOfPaddedString int = (select MAX(LEN(StringValue)) from @stringValues);
declare @longestStringValue varchar(max) = (select top(1) StringValue from @stringValues where LEN(StringValue) = @maxLengthOfPaddedString);
select [@longestStringValue]=@longestStringValue, [@maxLengthOfPaddedString]=@maxLengthOfPaddedString;
-- Loop through each of the test string values, apply padding to it, and store the results in [@testingResults].
while (1=1)
begin
declare
@stringValueRowId int,
@stringValue varchar(max);
-- Get the next row in the [@stringLengths] table.
select top(1) @stringValueRowId = RowId, @stringValue = StringValue
from @stringValues
where RowId > isnull(@stringValueRowId, 0)
order by RowId;
if (@@ROWCOUNT = 0)
break;
-- Here is where the padding magic happens.
declare @paddedStringValue varchar(max) = RIGHT(REPLICATE(@charToPadStringWith, @maxLengthOfPaddedString) + @stringValue, @maxLengthOfPaddedString);
-- Added to the list of results.
insert into @testingResults (StringValue, PaddedStringValue) values (@stringValue, @paddedStringValue);
end
-- Get all of the testing results.
select * from @testingResults;
मुझे पता है कि यह इस बिंदु पर बातचीत के लिए बहुत कुछ नहीं जोड़ रहा है, लेकिन मैं एक फ़ाइल पीढ़ी की प्रक्रिया चला रहा हूं और यह अविश्वसनीय रूप से धीमा हो रहा है। मैं प्रतिकृति का उपयोग कर रहा हूं और इस ट्रिम विधि को देखा और सोचा कि मैं इसे एक शॉट दूंगा।
आप मेरे कोड में देख सकते हैं कि दोनों के बीच स्विच नए @ पैडिंग चर के अलावा है (और सीमा अब मौजूद है)। मैंने निष्पादन समय में एक ही परिणाम के साथ दोनों राज्यों में समारोह के साथ अपनी प्रक्रिया चलाई। तो कम से कम SQLServer2016 में, मुझे दक्षता में कोई अंतर नहीं दिख रहा है जो अन्य पाया गया है।
वैसे भी, यहाँ मेरा UDF है जो मैंने सालों पहले लिखा था और आज जो बदलाव आया है वह अन्य की तुलना में उतना ही है जितना कि इसके अलावा एक LEFT / RIGHT param विकल्प और कुछ त्रुटि जाँच है।
CREATE FUNCTION PadStringTrim
(
@inputStr varchar(500),
@finalLength int,
@padChar varchar (1),
@padSide varchar(1)
)
RETURNS VARCHAR(500)
AS BEGIN
-- the point of this function is to avoid using replicate which is extremely slow in SQL Server
-- to get away from this though we now have a limitation of how much padding we can add, so I've settled on a hundred character pad
DECLARE @padding VARCHAR (100) = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
SET @padding = REPLACE(@padding, 'X', @padChar)
SET @inputStr = RTRIM(LTRIM(@inputStr))
IF LEN(@inputStr) > @finalLength
RETURN '!ERROR!' -- can search for ! in the returned text
ELSE IF(@finalLength > LEN(@inputStr))
IF @padSide = 'L'
SET @inputStr = RIGHT(@padding + @inputStr, @finalLength)
--SET @inputStr = REPLICATE(@padChar, @finalLength - LEN(@inputStr)) + @inputStr
ELSE IF @padSide = 'R'
SET @inputStr = LEFT(@inputStr + @padding, @finalLength)
--SET @inputStr = @inputStr + REPLICATE(@padChar, @finalLength - LEN(@inputStr))
-- if LEN(@inputStr) = @finalLength we just return it
RETURN @inputStr;
END
-- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'R' ) from tblAccounts
-- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'L' ) from tblAccounts
मेरा एक फ़ंक्शन है जो x डेसीमल के साथ lpad है: क्रिएट फ़ंक्शन [dbo]। [LPAD_DEC] - (यहाँ फंक्शन के लिए पैरामीटर जोड़ें @pad nvarchar (MAX), @string nvarchar (MAX), @length int, @dec int ) RETURNS nvarchar (अधिकतम) AS BEGIN - रिटर्न वैरिएबल यहां घोषित करें DECLARE @resp nvarchar (अधिकतम)
IF LEN(@string)=@length
BEGIN
IF CHARINDEX('.',@string)>0
BEGIN
SELECT @resp = CASE SIGN(@string)
WHEN -1 THEN
-- Nros negativos grandes con decimales
concat('-',SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec)))
ELSE
-- Nros positivos grandes con decimales
concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(@string,@length,@dec)))
END
END
ELSE
BEGIN
SELECT @resp = CASE SIGN(@string)
WHEN -1 THEN
--Nros negativo grande sin decimales
concat('-',SUBSTRING(replicate(@pad,@length),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec)))
ELSE
-- Nros positivos grandes con decimales
concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(@string,@length,@dec)))
END
END
END
ELSE
IF CHARINDEX('.',@string)>0
BEGIN
SELECT @resp =CASE SIGN(@string)
WHEN -1 THEN
-- Nros negativos con decimales
concat('-',SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec)))
ELSE
--Ntos positivos con decimales
concat(SUBSTRING(replicate(@pad,@length),1,@length-len(@string)),ltrim(str(abs(@string),@length,@dec)))
END
END
ELSE
BEGIN
SELECT @resp = CASE SIGN(@string)
WHEN -1 THEN
-- Nros Negativos sin decimales
concat('-',SUBSTRING(replicate(@pad,@length-3),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec)))
ELSE
-- Nros Positivos sin decimales
concat(SUBSTRING(replicate(@pad,@length),1,(@length-3)-len(@string)),ltrim(str(abs(@string),@length,@dec)))
END
END
RETURN @resp
समाप्त
यदि मेरे पास आवश्यक हो, तो दो दशमलव स्थानों पर संख्यात्मक मान प्रदान करने के लिए लेकिन शून्य से दाएं-गद्देदार हों:
DECLARE @value = 20.1
SET @value = ROUND(@value,2) * 100
PRINT LEFT(CAST(@value AS VARCHAR(20)), LEN(@value)-2) + '.' + RIGHT(CAST(@value AS VARCHAR(20)),2)
अगर कोई भी एक भद्दा तरीका सोच सकता है, तो उसकी सराहना की जाएगी - ऊपर से अनाड़ी लगता है ।
नोट : इस उदाहरण में, मैं HTML प्रारूप में रिपोर्ट को ईमेल करने के लिए SQL सर्वर का उपयोग कर रहा हूं और इसलिए डेटा को पार्स करने के लिए अतिरिक्त टूल को शामिल किए बिना जानकारी को प्रारूपित करना चाहता हूं।
यहाँ बताया गया है कि मैं सामान्य रूप से कैसे एक चरखी को पैड करूँगा
WHILE Len(@String) < 8
BEGIN
SELECT @String = '0' + @String
END