যদি আপনাকে আপনার পরিবেশে সিএলআর ব্যবহার করার অনুমতি দেওয়া হয় তবে এটি কোনও ব্যবহারকারী-সংজ্ঞায়িত সামগ্রীর জন্য একটি দর্জি দ্বারা তৈরি কেস।
বিশেষত, যদি সোর্স ডেটা অ-তুচ্ছভাবে বড় হয় এবং / অথবা আপনার অ্যাপ্লিকেশনটিতে আপনাকে এই ধরণের জিনিসটি অনেক কিছু করতে হয় তবে সম্ভবত এটি যাওয়ার উপায়। আমি দৃ strongly়ভাবে সন্দেহ করি যে হারুনের সমাধানের জন্য ক্যোয়ারী পরিকল্পনাটি ইনপুট আকার বাড়ার সাথে সাথে স্কেল হবে না। (আমি টেম্প টেবিলের সাথে একটি সূচক যুক্ত করার চেষ্টা করেছি, তবে তাতে কোনও লাভ হয়নি didn't)
অন্যান্য সমাধানের মতো এই সমাধানটিও একটি বাণিজ্য off
- এমনকি আপনার বা আপনার ক্লায়েন্টের, পরিবেশে সিএলআর ইন্টিগ্রেশন ব্যবহার করার জন্য রাজনীতি / নীতি।
- সিএলআর ফাংশনটি সম্ভবত দ্রুততর এবং ডেটাগুলির প্রকৃত সেটকে দেওয়া হলে আরও ভাল স্কেল হবে।
- সিএলআর ফাংশন অন্যান্য প্রশ্নের ক্ষেত্রে পুনরায় ব্যবহারযোগ্য হবে এবং প্রতিবার যখন এই ধরণের জিনিসটি করার দরকার হয় তখন আপনাকে একটি জটিল উপকণার সদৃশ (এবং ডিবাগ) করতে হবে না।
- স্ট্রেট টি-এসকিউএল একটি বাহ্যিক কোডের এক টুকরো লেখা এবং পরিচালনার চেয়ে সহজ।
- সম্ভবত আপনি কীভাবে সি # বা ভিবিতে প্রোগ্রাম করবেন তা জানেন না।
- প্রভৃতি
সম্পাদনা: ঠিক আছে, আমি এটি দেখার চেষ্টা করতে গিয়েছিলাম যে এটি আসলে ভাল ছিল কিনা, এবং এটি প্রমাণিত হয়েছে যে মন্তব্যগুলি একটি নির্দিষ্ট ক্রমে হওয়া উচিত বর্তমানে সামগ্রিক ফাংশনটি ব্যবহার করে সন্তুষ্ট করা সম্ভব নয়। :(
স্ক্লুউসারডিফাইনডআগ্রিগ্রেটএট্রিবিউট.আইএসআইভারিয়ানটটো অর্ডার দেখুন । মূলত, আপনার যা করা দরকার তা হ'ল OVER(PARTITION BY customer_code ORDER BY row_num)
তবে সমষ্টি করার সময় ORDER BY
এই OVER
দফাটিতে সমর্থন করা যায় না । আমি ধরে নিচ্ছি এসকিউএল সার্ভারে এই কার্যকারিতাটি যুক্ত করার ফলে কৃমির একটি ক্যান খোলে, কারণ কার্যকর করার পরিকল্পনায় যা পরিবর্তন করা দরকার তা তুচ্ছ। পূর্বোক্ত লিঙ্কটি বলছে এটি ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত, সুতরাং এটি ভবিষ্যতে প্রয়োগ করা যেতে পারে (২০০৫ এ আপনি সম্ভবত ভাগ্যের বাইরে রয়েছেন)।
এটি সামগ্রিক স্ট্রিংয়ের মধ্যে মানটি প্যাকিং এবং বিশ্লেষণ করে এখনও সিএলআর অবজেক্টের মধ্যে বাছাই করে সম্পন্ন করা যেতে পারে row_num
... যা বেশ হ্যাকিশ বলে মনে হয়।
যে কোনও ইভেন্টে, অন্য যে কেউ সীমাবদ্ধতার পরেও এটি দরকারী খুঁজে পেতে ক্ষেত্রে আমি নীচের কোডটি ব্যবহার করেছি। আমি হ্যাকিংয়ের অংশটি পাঠকের অনুশীলন হিসাবে ছেড়ে দেব। নোট করুন যে আমি পরীক্ষার ডেটার জন্য অ্যাডভেঞ্চার ওয়ার্কস (2005) ব্যবহার করেছি।
সমষ্টি সমাবেশ:
using System;
using System.IO;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace MyCompany.SqlServer
{
[Serializable]
[SqlUserDefinedAggregate
(
Format.UserDefined,
IsNullIfEmpty = false,
IsInvariantToDuplicates = false,
IsInvariantToNulls = true,
IsInvariantToOrder = false,
MaxByteSize = -1
)]
public class StringConcatAggregate : IBinarySerialize
{
private string _accum;
private bool _isEmpty;
public void Init()
{
_accum = string.Empty;
_isEmpty = true;
}
public void Accumulate(SqlString value)
{
if (!value.IsNull)
{
if (!_isEmpty)
_accum += ' ';
else
_isEmpty = false;
_accum += value.Value;
}
}
public void Merge(StringConcatAggregate value)
{
Accumulate(value.Terminate());
}
public SqlString Terminate()
{
return new SqlString(_accum);
}
public void Read(BinaryReader r)
{
this.Init();
_accum = r.ReadString();
_isEmpty = _accum.Length == 0;
}
public void Write(BinaryWriter w)
{
w.Write(_accum);
}
}
}
পরীক্ষার জন্য টি-এসকিউএল ( CREATE ASSEMBLY
এবং sp_configure
সিএলআর বাদ দেওয়া সক্ষম করতে):
CREATE TABLE [dbo].[Comments]
(
CustomerCode int NOT NULL,
RowNum int NOT NULL,
Comments nvarchar(25) NOT NULL
)
INSERT INTO [dbo].[Comments](CustomerCode, RowNum, Comments)
SELECT
DENSE_RANK() OVER(ORDER BY FirstName),
ROW_NUMBER() OVER(PARTITION BY FirstName ORDER BY ContactID),
Phone
FROM [AdventureWorks].[Person].[Contact]
GO
CREATE AGGREGATE [dbo].[StringConcatAggregate]
(
@input nvarchar(MAX)
)
RETURNS nvarchar(MAX)
EXTERNAL NAME StringConcatAggregate.[MyCompany.SqlServer.StringConcatAggregate]
GO
SELECT
CustomerCode,
[dbo].[StringConcatAggregate](Comments) AS AllComments
FROM [dbo].[Comments]
GROUP BY CustomerCode