ورود

View Full Version : جستجو



elahe_rahmanzadeh
یک شنبه 09 اردیبهشت 1386, 11:01 صبح
سلام
پایگاه داده ای برای کتابخانه ای در نظر گرفتم که دارای 3 جدول به شرح زیر است:

tbl_books :که محتویات این جدول مشخصات کتابهاست مثل کد کتاب, نام کتاب , انتشارات, قیمت, شابک, ویرایش و.....
tbl_author : که محتویات این جدول شامل : کد نویسنده, نام نویسنده و نام خانوادگی نویسنده است.
tbl_book_author: محتویات این جدول نیز شامل :کد کتاب و کد نویسنده است.من برای این نویسنده را در جدول tbl_books قرار ندادم چون ممکن است یک کتاب چندین نویسنده داشته باشد.حال در جستجوی یک کتاب که دارای 3 نویسنده می باشد چطور می توان نویسنده ها را کنار هم در یک ردیف نشان داد و با کاما اسامی را از هم جدا کرد؟؟

sahab555
یک شنبه 09 اردیبهشت 1386, 11:16 صبح
یک راهی که من خودم زیاد از اون استفاده می کنم از این قراره:

یک function تعریف کن که کد کتاب رو به عنوان ورودی میگیره و داخل اون یک متغیر از نوع nvarchar تعریف کن که با select ای که داخل جدول هایت می کنی اسامی نویسنده ها را پشت سر هم قرار داده و به متغیرت نسبت می دهد بعد این متغیر را با return به عنوان خروجی function در نظر بگیر
حالا یک view تعریف کن که همه فیلدهای مد نظرت بعلاوه function ات را در select اون قرار میدی
اگه در تعریف function مشکل داری بگو تا بیشتر راهنمایی کنم

AminSobati
یک شنبه 09 اردیبهشت 1386, 16:05 عصر
دوست عزیزم،
همچنین اگر در SQL Server 2005 کار میکنین، میتونین User Defined Aggregate با NET. بنویسید که اساسا برای همین منظور در نظر گرفته شده و نسبت به روش مذکور در پست قبلی (که تنها روش برای 2000 هستش) سرعت مطلوب تری داره

elahe_rahmanzadeh
دوشنبه 10 اردیبهشت 1386, 08:36 صبح
یک راهی که من خودم زیاد از اون استفاده می کنم از این قراره:

یک function تعریف کن که کد کتاب رو به عنوان ورودی میگیره و داخل اون یک متغیر از نوع nvarchar تعریف کن که با select ای که داخل جدول هایت می کنی اسامی نویسنده ها را پشت سر هم قرار داده و به متغیرت نسبت می دهد بعد این متغیر را با return به عنوان خروجی function در نظر بگیر
حالا یک view تعریف کن که همه فیلدهای مد نظرت بعلاوه function ات را در select اون قرار میدی
اگه در تعریف function مشکل داری بگو تا بیشتر راهنمایی کنم
میشه در مورد function بیشتر توضیح بدید؟
ممنون

elahe_rahmanzadeh
دوشنبه 10 اردیبهشت 1386, 08:45 صبح
ممکنه در مورد User Defined Aggregate با Net. کمی توضیح بدین؟(یعنی در محیط net. باید کار کنم؟)
ممنون

Kamyar.Kimiyabeigi
دوشنبه 10 اردیبهشت 1386, 11:26 صبح
میشه در مورد function بیشتر توضیح بدید؟
ممنون

User Defined Function در SQL مانند Function ایی هست که شما در محیط برنامه نویسی میسازین و استفاده میکنین یعنی قابل ذخیره شدن هست مانند SP و نیز مقدار خروجی نیز دارد. از قابلیتهای Function : امکان فراخوانی آن در Query ها و همین طور در قسمت From , مربوط به Select میباشد و .....
مثال


In this example, a user-defined function, ISOweek, takes a date argument and calculates the ISO week number. For this function to calculate properly, SET DATEFIRST 1 must be invoked before the function is called.

CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END

Here is the function call. Notice that DATEFIRST is set to 1.

SET DATEFIRST 1
SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week'
Here is the result set.

ISO Week
----------------
52


اطلاعات بیشتر داخل BOL هست

elahe_rahmanzadeh
دوشنبه 10 اردیبهشت 1386, 20:50 عصر
از توضیحتون ممنون .ولی منظور من functionی بود که کاربر sahab555 گفته بودن!یعنی چطور در یک تابع می توان با select اسامی نویسنده ها رو کنار هم(با یک کاما) در یک متغیر (از نوع nvarchar) ریخت؟؟

AminSobati
دوشنبه 10 اردیبهشت 1386, 23:08 عصر
بله، برای User Defined Aggregate باید این تابع رو در NET. بسازین و در SQL Server استفاده کنین. اما در 2000 میتونین به این شکل عمل کنین (این تابع نام کشور رو دریافت میکنه و کد مشتریهایی که از این کشور داریم رو برمیگردونه. دقت کنید که من Group By رو برای حذف کشورهای اضافی قید کردم)


use northwind
go

create function fn_Concat(@country nvarchar(20))
returns nvarchar(4000)
as
begin
declare @tmp nvarchar(4000)
set @tmp=''
select @tmp=@tmp+ ',' + isnull(customerid,'') from customers where country=@country
set @tmp=right(@tmp,len(@tmp)-1)
return @tmp
end
go

select dbo.fn_Concat('uk')
GO
select country,dbo.fn_Concat(country) from customers group by country

deuce
دوشنبه 10 اردیبهشت 1386, 23:19 عصر
سلام
نیازی به function و یا استفاده از sqlserver 2005 نیست با COALESCE می توانید اینکار را انجام دهید .


DECLARE @list nvarchar(100)
SET @list = ''
select @list=COALESCE(@list+ ',','')+cast(myField as nvarchar) from myTable



با این روش ستون myField از جدول myTable را می توانید در یک سطر به صورت جدا شده با کاما تحویل بگیرید

rezaei manesh
سه شنبه 09 مهر 1387, 10:43 صبح
با سلام خدمت دوستان من هم همچین مشکلی دارم با 2005
من خیلی سعی کردم از کد دوستمون deuce استفاده کنم اما نمشه گروپ کرد با این روش به کد و خطای ان نگاه کنید.


SELECT DISTINCT PersonId,COALESCE(@list+ ',','')+cast(WorkGrpId as nvarchar)
FROM DayWork
WHERE (DDATE BETWEEN @sDate AND @EDate)
group by DayWork.PersonId

خطا:


Msg 8120, Level 16, State 1, Line 29
Column 'DayWork.WorkGrpId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

در ضمن خواستم فیلد گروه رو توسط سلکت تو در تو بیارم اما باز همین خطا رو داد.
در مورد استفاده از فانکشن ها هم من نتونستم که بفهمم که تابع دوست مون کامیار چه ربطی به موضوع داره شاید فقط خواستن کار با توابع رو یاد بدن....
فکر کنم از بخوایم از تابع استفاده کنیم باید از کرسر ها هم استفاده کنیم که کمی پیچیده و کند می شه و...

AminSobati
سه شنبه 09 مهر 1387, 20:29 عصر
UDA یا User Defined Aggregate در حقیقت یک تابع هستش، ورودی میگیره و خروجی برمیگردونه. ولی SQL Server به شکلی متفاوت با اون رفتار میکنه درست مثل سایر توابع Aggregation (یعنی MIN,MAX,SUM و ..). تفاوتش با توابع عادی در اینجاست که میتونیم ازش در محاسبات گروهی استفاده کنیم و محاسبات دلخواه رو روی گروههای اطلاعات انجام بدیم. فرض کنین به جای SUM، شما میخواین در هر گروه از اطلاعات عمل ضرب بین اعداد انجام بشه به جای جمع. لذا میتونین در NET. یک UDA بنویسید و ازش در SQL Server استفاده کنید. از اونجاییکه UDA برای محاسبات گروهی استفاده میشه، SQL Server به خوبی میدونه به چه صورت ازش استفاده کنه تا بهینه ترین الگورتیمها به خدمت گرفته بشن

rezaei manesh
پنج شنبه 11 مهر 1387, 08:36 صبح
با سلام و عرض ادب و تبریک عید فطر
ممنون که در مورد UDA توضیح دادین
اما مشکل من اینه که من به ازای هر کد پرسنل باید کدهای گروه ان که در فیلد دیگری از همین جدول هست رو بردارم و توسط اون نام گروه ها را از جدول گروه ها پیدا کنم و با کاما جدا کنم و کنار هم بچینم.
یعنی شما می گی من کد پرسنل رو ورودی تابع کنم و خودم تو تابع بیام دوباره به ازای هر کد پرسنل گروه های اون رو یکی یکی بردارم و اسم اونوا رو دستی در بیارم و خروجی تابع بدم؟

AminSobati
پنج شنبه 11 مهر 1387, 14:25 عصر
ساختار جداول شما رو اطلاعی ندارم. شاید لازم باشه Join کنین یا از Subquery استفاده کنین. اگر اصل مفهوم UDA و Aggregation رو درک کرده باشین براحتی میتونین اینها رو با هم ترکیب کنین. مهم دونستن این نکته هست که هر کدوم از قابلیتها دقیقا کجای کار رو میتونن برای ما انجام بدن

rezaei manesh
شنبه 13 مهر 1387, 10:25 صبح
سلام
من شرمنده ام فکر کنم هنوز نگرفتم
من الان فقط می تونم یه تابع معمولی بنویسم و و وروی اون شماره پرسنل باشه و تو تابع توسط کرسر ها اطلاعات رو کنار هم بچینم و بدم خروجی اما می دونم که روش خوبی نیست
لطفاً یه مثال بزنین که چطور باید از uda استفاده کنم من تا به حال تو دات نت تابعی ننوشتم که تو اس کیو ال فراخوانی بشه
بازم ممنونم

AminSobati
شنبه 13 مهر 1387, 20:29 عصر
متاسفانه UDA مطلبی نیست که من با چند سطر توضیح بتونم از طریق این تاپیک همش رو منتقل کنم. توصیه میکنم اول شما در مورد استفاده از CLR در SQL Server مطالعه کنید و بعد در اینترنت دنبال مثالهای UDA بگردین. این لینک میتونه نقطه خوبی برای شروع باشه:
http://dotnetslackers.com/articles/sql/Introduction-to-CLR-Database-Objects.aspx

baidin
جمعه 29 خرداد 1388, 12:24 عصر
سلام
من شرمنده ام فکر کنم هنوز نگرفتم
من الان فقط می تونم یه تابع معمولی بنویسم و و وروی اون شماره پرسنل باشه و تو تابع توسط کرسر ها اطلاعات رو کنار هم بچینم و بدم خروجی اما می دونم که روش خوبی نیست
لطفاً یه مثال بزنین که چطور باید از uda استفاده کنم من تا به حال تو دات نت تابعی ننوشتم که تو اس کیو ال فراخوانی بشه
بازم ممنونم

دوست عزیز مشکل شما حل شد؟
اگه امکان داره این تایپیک را هم ببینید
http://barnamenevis.org/forum/showthread.php?t=164319