LQL ফাংশন এসকিউএল সার্ভারে স্থান অনুসরণ করে না


109

এসকিউএল সার্ভার ২০০৫-এ আমার নিম্নলিখিত পরীক্ষার সারণী রয়েছে:

CREATE TABLE [dbo].[TestTable]
(
 [ID] [int] NOT NULL,
 [TestField] [varchar](100) NOT NULL
) 

এর সাথে জনবহুল:

INSERT INTO TestTable (ID, TestField) VALUES (1, 'A value');   -- Len = 7
INSERT INTO TestTable (ID, TestField) VALUES (2, 'Another value      '); -- Len = 13 + 6 spaces

যখন আমি এসকিউএল সার্ভার লেন () ফাংশন দিয়ে টেস্টফিল্ডের দৈর্ঘ্য সন্ধান করার চেষ্টা করি তখন এটি পিছনের স্থানগুলি গণনা করে না - যেমন:

-- Note: Also results the grid view of TestField do not show trailing spaces (SQL Server 2005).
SELECT 
 ID, 
 TestField, 
 LEN(TestField) As LenOfTestField, -- Does not include trailing spaces
FROM 
 TestTable

আমি দৈর্ঘ্যের ফলাফলের পিছনে স্থানগুলি কীভাবে অন্তর্ভুক্ত করব?


1
আমি মনে করি এখানের আসল সমাধান মাইক্রোসফ্টের তাদের ভাঙা সফ্টওয়্যারটি ঠিক করার জন্য হতে পারে। এখানে ভোট দিন: feedback.azure.com/forums/908035-sql-server/suggestions/...
QA তে কালেকটিভ

উত্তর:


125

এটি মাইক্রোসফ্ট দ্বারা এমএসডিএন-তে http://msdn.microsoft.com/en-us/library/ms190329(SQL.90).aspx এ স্পষ্ট করে নথিভুক্ত করা হয়েছে , যা এলইএন "নির্দিষ্ট স্ট্রিং এক্সপ্রেশনটির অক্ষরের সংখ্যা প্রদান করে, ব্যতীত ফাঁকা ফাঁকা স্থান "। তবে, যদি আপনি সতর্ক না হন তবে এটি মিস করার সহজ তথ্য এটি।

পরিবর্তে আপনাকে ডেটাএলএনজিটিএইচ ফাংশনটি ব্যবহার করতে হবে - দেখুন http://msdn.microsoft.com/en-us/library/ms173486(SQL.90).aspx - যা "কোনও অভিব্যক্তি উপস্থাপনে ব্যবহৃত বাইটের সংখ্যা প্রদান করে"।

উদাহরণ:

SELECT 
    ID, 
    TestField, 
    LEN(TestField) As LenOfTestField,           -- Does not include trailing spaces
    DATALENGTH(TestField) As DataLengthOfTestField      -- Shows the true length of data, including trailing spaces.
FROM 
    TestTable

52
উল্লেখ্য: জন্য DATALENGTHআপনার কাছে যদি অভিব্যক্তি পরীক্ষা করা হচ্ছে ব্যাপক চরিত্র ধরনের 2 দ্বারা ফলাফলের ভাগ করতে হবে; যেহেতু ফলাফলের হয়, (ইউনিকোড nchar, nvarchar বা ntext) বাইট , না অক্ষর
8:25 '

7
এছাড়াও varcharইত্যাদির জন্য এটি কোলেশন নির্ভর হতে পারে এবং এমনকি 2 দ্বারা সরাসরি এগিয়ে বিভাগও নির্ভরযোগ্য নয়। এখানে উদাহরণ
মার্টিন স্মিথ

18
আমি ব্যবহার করব LEN(REPLACE(expr, ' ', '_'))। এই সঙ্গে কাজ করা উচিত varcharএবং nvarcharএবং বিশেষ ইউনিকোড নিয়ন্ত্রণ অক্ষর ধারণকারী স্ট্রিং।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস 16

6
-1, DATALENGTH()অক্ষর গণনা করার বিকল্প উপায় হিসাবে বিবেচনা করা উচিত নয় কারণ এটি অক্ষরের পরিবর্তে বাইটগুলি গণনা করে এবং VARCHAR/ এ একই স্ট্রিংটির প্রতিনিধিত্ব করার সময় এই বিষয়গুলি বিবেচনা করে NVARCHAR
বিনকি

5
এসকিউএল সার্ভার ২০১২ থেকে শুরু করে, সংস্করণ 100 কোলিশনের ইউনিকোড কলামগুলি এখন সারোগেট জোড়া সমর্থন করে supports এর অর্থ একটি একক অক্ষর 4 টি বাইট পর্যন্ত ব্যবহার করতে পারে যার ফলে দুটি কৌশল দ্বারা বিভাজন ব্যর্থ হয়। এমএসডিএন দেখুন ।
ফ্রেডেরিক 26'15

85

আপনি এই কৌশলটি ব্যবহার করতে পারেন:

লেন (স্ট্রেন + 'এক্স') - ১


15
আপনি কি আরও ভাল বিকল্প দিয়ে আমাদের আলোকিত করতে পারেন, দয়া করে? ডেটা দৈর্ঘ্য নিশ্চিত না।
সার্জ

15
আমি দৃ strongly়ভাবে একমত নই যে কোনও বেমানান পদ্ধতি ব্যবহার করা (কিছু ক্ষেত্রে আপনি এর ফলাফলটিকে 2 দ্বারা ভাগ করেন এবং কখনও কখনও না) আরও ভাল বিকল্প। যদিও আমার পদ্ধতির সাথে হিরো প্রায় পারফরম্যান্স হিট আছে।
সার্জ

5
@ ইউএসআর সার্জের পদ্ধতিটি সেরা, আইএমএইচও। সহজ এবং মার্জিত। ডেটালেগটি জটিল: একক / ডাবল বাইট টাইপ নির্ভরশীল, কোলেশন / ভাষা নির্ভর, ইত্যাদি
মিঃ টিএ

10
এটি এখন পর্যন্ত সেরা, মার্জিত সমাধান। হ্যাক লাগছে বা না লাগলে আমি সত্যিই যত্নশীল নই (কোডিং অনুভূতি সম্পর্কে নয়), আমি সত্যই যত্নশীল যে এই সমাধানটির কোনও পার্শ্ব প্রতিক্রিয়া নেই। আমি ডেটা টাইপ বারচার / এনভারচার পরিবর্তন করতে পারি এবং এটি এখনও কার্যকর। ভাল করেছ.
মাইক কেসকিনভ 21

5
এই পার্শ্ব প্রতিক্রিয়াটির কারণে একটি সতর্কতা রয়েছে। আপনি যদি এনভারচার (4000) প্রকারের ভেরিয়েবলের সাথে কাজ করে থাকেন এবং আপনার ভেরিয়েবলটিতে 4000 অক্ষরের স্ট্রিং রয়েছে তবে যুক্ত অক্ষরটিকে উপেক্ষা করা হবে এবং আপনি ভুল ফল পাবেন (এসকিউএল এর লেন যা পিছনের স্থানগুলিকে উপেক্ষা করে, কম 1 আপনি বিয়োগ)।
হ্যাচেট -

17

আমি এই পদ্ধতিটি ব্যবহার করি:

LEN(REPLACE(TestField, ' ', '.'))

আমি এটি ডেটালেঞ্জের চেয়ে বেশি পছন্দ করি কারণ এটি বিভিন্ন ডেটা ধরণের সাথে কাজ করে এবং আমি এটিকে শেষের দিকে একটি অক্ষর যুক্ত করার চেয়ে পছন্দ করি কারণ আপনার স্ট্রিংটি ইতিমধ্যে সর্বোচ্চ দৈর্ঘ্যে রয়েছে এমন প্রান্তের ক্ষেত্রে আপনাকে চিন্তার দরকার নেই।

দ্রষ্টব্য: আমি খুব বড় ডেটা সেটের বিপরীতে ব্যবহারের আগে পারফরম্যান্সটি পরীক্ষা করব; যদিও আমি এটি কেবল 2M সারিগুলির বিপরীতে পরীক্ষা করেছি এবং এটি প্রতিস্থাপন ছাড়া লেনের চেয়ে ধীর ছিল না ...


14

"আমি দৈর্ঘ্যের ফলাফলের পিছনে স্থানগুলি কীভাবে অন্তর্ভুক্ত করব?"

আপনি কাউকে একটি এসকিউএল সার্ভার বর্ধিতকরণের অনুরোধ / বাগ রিপোর্ট ফাইল করতে পারেন কারণ এই আশ্চর্যজনকভাবে সহজ ইস্যুতে প্রায় সমস্ত তালিকাভুক্ত ওয়ার্কআরউন্ডের কিছুটা অভাব বা অদক্ষতা রয়েছে। এটি এখনও এসকিউএল সার্ভার ২০১২-তে সত্য বলে প্রতীয়মান The

দয়া করে এখানে "সেটিং যুক্ত করুন যাতে সাদা স্থানের লেইন গণনা করা হয়" ভোট দিন:

https://feedback.azure.com/forums/908035-sql-server/suggestions/34673914-add-setting-so-len-counts-trailing-whitespace

অবসরপ্রাপ্ত সংযোগ লিঙ্ক: https://connect.microsoft.com/SQLServer/feedback/details/801381


2
datalengthসমাধান এমনকি খারাপ, এসকিউএল সার্ভার 2012 থেকে শুরু যেহেতু এটি এখন হল UTF-16 ভাড়াটে জোড়া সমর্থন করে, যার অর্থ একটি অক্ষর 4 বাইট পর্যন্ত ব্যবহার করতে পারেন করা হয়। lenএএনএসআই মেনে চলার জন্য তারা ফাংশনটি ঠিক করার সময় এসেছে বা অন্তত ট্রেলিং স্পেস সহ চর গণনা করার জন্য একটি উত্সর্গীকৃত ফাংশন সরবরাহ করে।
ফ্রেডেরিক 26'15

1
এর জন্য ফিডব্যাক লিঙ্কটি আরও ব্যবহার করা দরকার। অবাক করে দিচ্ছে যে এই সমস্যাটি কেবলমাত্র ইন্টারনেটের মাধ্যমে অনুসন্ধান করা যেতে পারে। LEN () ফাংশনটি আমার সংযোগ বিচ্ছিন্ন হওয়ার কারণ বলে বিবেচনা করার আগে আমি নিজের কোডটিতে কোথায় ভুল করেছি তা জানার চেষ্টা করতে প্রায় 2 ঘন্টা সময় ব্যয় করেছি।
টোকোফিলিয়াক

আমি এর সাথে একমত তবে একটি প্যারামিটারটিকে সাদা স্পেস ছাঁটাই করার অনুমতি দেওয়া উচিত .. কারণ এটি EF এর সাথে স্ট্রিং তুলনা অনেক সহজ করে তোলে, যখন iqueryable এক্সপ্রেশনটি নির্মিত হয় তখন হোয়াইটস্পেস অন্তর্ভুক্ত রয়েছে কিনা তা পরীক্ষা করে দেখার দরকার নেই।
গেঞ্জেই

9

দুটি শীর্ষ ভোট দেওয়া উত্তর নিয়ে সমস্যা রয়েছে। প্রস্তাবিত উত্তরটি DATALENGTHপ্রোগ্রামার ত্রুটিগুলির প্রবণ। ফলাফলগুলি DATALENGTHঅবশ্যই 2 দ্বারা ভাগ করতে হবে NVARCHARতবে VARCHARপ্রকারের জন্য নয় । এর জন্য আপনি যে ধরণের দৈর্ঘ্য পাচ্ছেন তার জ্ঞান প্রয়োজন এবং যদি এই ধরণের পরিবর্তন হয় তবে আপনার ব্যবহৃত স্থানগুলি যত্ন সহকারে পরিবর্তন করতে হবে DATALENGTH

সর্বাধিক উত্সাহিত উত্তরের সাথেও একটি সমস্যা রয়েছে (যা আমি স্বীকার করি যে এই সমস্যাটি আমাকে বিট না করা পর্যন্ত এটি করা আমার পছন্দসই উপায় ছিল)। আপনি যে জিনিসটির দৈর্ঘ্য পাচ্ছেন সেটি যদি টাইপের হয় NVARCHAR(4000)এবং এটিতে আসলে 4000 টি অক্ষরের একটি স্ট্রিং থাকে, তবে এসকিউএল সংক্ষিপ্তভাবে ফলাফলটি ছড়িয়ে দেওয়ার পরিবর্তে সংযুক্তিযুক্ত চরিত্রটিকে উপেক্ষা করবে NVARCHAR(MAX)। শেষ ফলাফলটি একটি ভুল দৈর্ঘ্য। একই জিনিসটি ভ্রচার (8000) এর সাথে ঘটবে।

আমি যা কাজ পেয়েছি, প্রায় পুরানো সমান হিসাবে দ্রুত LEN, LEN(@s + 'x') - 1বড় স্ট্রিংয়ের চেয়ে দ্রুত এবং এটি অন্তর্নিহিত অক্ষরের প্রস্থটি নিম্নলিখিত বলে ধরে নিচ্ছে না:

DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))

এটি ডেটালেথেনথ পায় এবং তারপরে স্ট্রিং থেকে একটি একক অক্ষরের ডেটালেথ দিয়ে ভাগ করে। 'এক্স' এর সংযোজনে স্ট্রিং ফাঁকা থাকা কেসটিকে কভার করে (যা সেই ক্ষেত্রে শূন্য দ্বারা একটি বিভাজন দেয়)। এই কিনা কাজ করে @sহয় VARCHARবা NVARCHARLEFTস্ট্রিং বড় হয়ে গেলে কিছু সময়ের জন্য শেভ হওয়ার আগে 1 টি অক্ষরের কাজটি করা । যদিও এর সাথে সমস্যাটি হ'ল এটি সরোগেট জোড় যুক্ত স্ট্রিংগুলির সাথে সঠিকভাবে কাজ করে না।

স্বীকৃত উত্তরের মন্তব্যে আরও একটি উপায় উল্লেখ করা হয়েছে, যা ব্যবহার করে REPLACE(@s,' ','x')। এই কৌশলটি সঠিক উত্তর দেয়, তবে স্ট্রিং বড় হওয়ার সাথে সাথে অন্য কৌশলগুলির চেয়ে ধীরে ধীরে মাত্রার কয়েকটি আদেশ হয়।

যে কোনও প্রযুক্তি ব্যবহার করে সার্োগেট জোড় দ্বারা প্রবর্তিত সমস্যাগুলি দেওয়া DATALENGTH, আমি মনে করি যে সবচেয়ে নিরাপদ পদ্ধতি যা সঠিক উত্তর দেয় যা আমি জানি তা নিম্নলিখিত:

LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1

এটি REPLACEকৌশলটির চেয়ে দ্রুত এবং লম্বা স্ট্রিং সহ আরও দ্রুত। মূলত এই কৌশলটি LEN(@s + 'x') - 1কৌশলটি, তবে প্রান্তের ক্ষেত্রে সুরক্ষার সাথে যেখানে স্ট্রিংটির দৈর্ঘ্য 4000 (এনভারচারের জন্য) বা 8000 (বারচারের জন্য) থাকে, যাতে সঠিক উত্তরটি এমনকি তার জন্য দেওয়া হয়। এটি সরোগেট জোড়গুলি সহ সঠিকভাবে স্ট্রিংগুলি পরিচালনা করতে হবে।


1
দুর্ভাগ্যক্রমে, এই উত্তরটি আর এসকিউএল সার্ভারে সরোগেট জোড়াযুক্ত স্ট্রিংয়ের জন্য আর কাজ করে না। আপনার ক্রিয়াকলাপটি চালানো N'x𤭢x' COLLATE Latin1_General_100_CI_AS_SC4 দেয়, যখন LEN3 দেয়
ডগলাস

9
@ ডগলাস - এটি দরকারী তথ্য। যদি কেবল মাইক্রোসফ্ট আমাদের কেবল এলইএন এর এমন একটি সংস্করণ দেয় যা পিছনের জায়গাগুলি উপেক্ষা করে না।
হ্যাচেট - 5:40

5

আপনার ডেটাটি পিছনে ফাঁকা ফাঁকা দিয়ে আসলে সংরক্ষণ করা হয়েছে তাও আপনাকে নিশ্চিত করতে হবে। যখন এএনএসআই প্যাডিং বন্ধ থাকে (অ-ডিফল্ট):

বর্ণের কলামে অক্ষরের মানগুলিতে ট্র্যাকিং ফাঁকা ছাঁটা হয়।


3
আমি মনে করি আপনার এএনএসআই প্যাডিং বন্ধ করা উচিত নয় কারণ এই সেটিংটি অপ্রচলিত। এটি একটি মানহীন মান হিসাবে রাখলে অনেকগুলি ছোট সমস্যা হয়।
usr

4

LEN ডিফল্টরূপে স্পেস পিছনের স্থানগুলি কেটে ফেলেছে, সুতরাং আপনি যখন তাদের সামনের দিকে নিয়ে যাবেন তখন আমি এটি কাজ করেছি

(LEN এর (বিপরীতক্রমে (TestField))

আপনি চাইলে তাই বলতে পারেন

SELECT
t.TestField,
LEN(REVERSE(t.TestField)) AS [Reverse],
LEN(t.TestField) AS [Count]
FROM TestTable t
WHERE LEN(REVERSE(t.TestField)) <> LEN(t.TestField)

অবশ্যই অগ্রণী স্থানগুলির জন্য এটি ব্যবহার করবেন না।


9
এখন এটি ফাঁকা স্থানগুলির পরিবর্তে নেতৃস্থানীয় স্পেসগুলি ছাঁটাই করে । একই দিন, ভিন্ন সমস্যা :)
বিপরীত প্রকৌশলী

@ ডেভবোল্টম্যান আমার পরামর্শ সম্ভবত আরও বিশৃঙ্খল, তবে আপনি অতিরিক্তভাবে ট্রিমের দৈর্ঘ্যের তুলনায় তুলনা করতে পারেন।
ব্রায়ান জে

এটি ত্রুটি বিপরীত করে যেখানে অগ্রণী স্থানগুলি পরিবর্তনের পরিবর্তে নেতৃস্থানীয় স্থানগুলি গণনা করা হয় না। নিম্নলিখিত কোডটি দেখুন: declare @TestField varchar(10); SET @TestField = ' abc '; -- Length with spaces is 5. select LEN(REVERSE(@TestField)) -- Returns 4 select LEN(@TestField) -- Returns 4
ধাতবলিক

1

আপনার যদি স্ট্রিং সংমিশ্রণ পছন্দ না হয় তবে আপনার একটি সিএলআর ফাংশন সংজ্ঞায়িত করা উচিত যা স্ট্রিংয়ের দৈর্ঘ্যের ক্ষেত্রটি দেয়। আমি LEN('x' + @string + 'x') - 2আমার উত্পাদন ব্যবহারের ক্ষেত্রে ব্যবহার করি।


0

যদি আপনি DATALENGTHএন / বারচার উদ্বেগগুলির কারণে অপছন্দ করেন তবে কীভাবে:

select DATALENGTH(@var)/isnull(nullif(DATALENGTH(left(@var,1)),0),1)

যা ঠিক

select DATALENGTH(@var)/DATALENGTH(left(@var,1))

বিভাজন দ্বারা শূন্য সুরক্ষা দিয়ে আবৃত।

একটি একক চরের ডাটাবেস দ্বারা ভাগ করে, আমরা দৈর্ঘ্যকে স্বাভাবিকীকরণ করি।

(অবশ্যই, যদি উদ্বিগ্ন-জুটি নিয়ে সমস্যা হয় তবে তা উদ্বেগজনক।)


-4

নির্বাচন করুন ডেটালেগথ ('স্ট্রিং')


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