PDA

View Full Version : درخواست راهنمایی Stuffو XML



azadeh_1510
سه شنبه 06 اسفند 1392, 18:00 عصر
سلام دوستان
من یه کد دارم که مفهوم قسمتی که از stuff استفاده کرده و خیلی کم متوجه شدم و قسمتی که از XML
استفاده کرده رو اصلا متوجه نشدم!


SELECT DISTINCT TOP (100) PERCENT dbo.MedicalCosts.Title, dbo.MedicalCosts.Id, STUFF
((SELECT ',' + MedicalDocumentTypes.Name
FROM view_MedicalCostByDocuments
WHERE MedicalCost_Id = MedicalCosts.Id FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') AS DocumentsName
FROM MedicalCosts INNER JOIN
MedicalDocuments ON MedicalCosts.Id = MedicalDocuments.MedicalCost_Id INNER JOIN
MedicalDocumentTypes ON MedicalDocuments.MedicalDocumentType = MedicalDocumentTypes.Id

در ادامه این قطعه کد قراره به ازای هر dbo.MedicalCosts.Titleیا dbo.MedicalCosts.Id
نام مدارک که به نام فیلد DocumentsName هست رو یه کاما اضافه کنه
یعنی مثلا بگه که به ازای یک title چه مدارکی (DocumentsName )وجود داره...
مثلا بشه:
دندانپزشکی : نسخه ، دستور پزشک
--------------------------------------
اما الان اتفاق که میفته خروجی اینه:
دندانپزشکی:نسخه ، نسخه
دندانپزشکی : دستور پزشک، دستور پزشک

حمیدرضاصادقیان
چهارشنبه 07 اسفند 1392, 07:22 صبح
سلام.
در واقع Stuff برای این هست که یک رشته را داخل یک رشته دیگر بر اساس نقطه شروعی که شما مشخص کردید جایگزین کند.
کاربرد XML Path نیز برای این هست که رشته هارو کنار هم قرار بده مانند : نسخه ، دستور پزشک

azadeh_1510
چهارشنبه 07 اسفند 1392, 09:31 صبح
خیلی ممنون از پاسختون اما برای مشکلی که شرحشو نوشتم که خروجی درست نمایش داده نمیشه مشکل از کجاست؟
یعنی مثلا به جای نمایش یک رکورد ،به صورت صحیح زیر:(دندانپزشکی:title هست و نسخه یا دستور پزشک MedicalDocumentTypes.Nameهست)
دندانپزشکی : نسخه ، دستور پزشک
به صورت اشتباه دو رکورد نمایش داده و به صورت اشتباه زیر نشان میدهد:
دندانپزشکی:نسخه ، نسخه
دندانپزشکی : دستور پزشک، دستور پزشک
چه باید کرد؟
در ضمن ممکنه خواهش کنم FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') رو دقیقتر توضیح بدین؟

azadeh_1510
چهارشنبه 07 اسفند 1392, 11:30 صبح
سلام
با این دستور درست شد:
SELECT DISTINCT TOP (100) PERCENT Title, Id,
STUFF ((SELECT ',' + Name
FROM view_MedicalCostByDocuments
WHERE MedicalCost_Id = MedicalCosts.Id FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') AS DocumentsName,
STUFF ((SELECT ',' +GETDATE(IssueDate)as date
FROM view_MedicalCostByDocuments
WHERE MedicalCost_Id = MedicalCosts.Id FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') AS DocumentsDate
FROM MedicalCosts
اما برای نمایش تاریخ این پیام خطا رو داره:

Msg 174, Level 15, State 1, Line 6
The getdate function requires 0 argument(s).

azadeh_1510
چهارشنبه 07 اسفند 1392, 12:14 عصر
اینهم درست شد و راهش هم این بود که تاریخ رو باید به رشته کانورت میکردیم:
اینو میذارم تا اگه کسی به دردش خورد بتونه استفاده کنه
SELECT DISTINCT TOP (100) PERCENT Title, Id,
STUFF ((SELECT ',' + Name
FROM view_MedicalCostByDocuments
WHERE MedicalCost_Id = MedicalCosts.Id FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') AS DocumentsName,
STUFF ((SELECT ',' +Convert(varchar(10),dbo.GetDate(IssueDate),101)
FROM view_MedicalCostByDocuments
WHERE MedicalCost_Id = MedicalCosts.Id FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') AS DocumentsDate
FROM MedicalCosts
منتها هنوزم تقاضا دارم در مورد دستور FOR XML PATH(''), type ).value('.', 'nvarchar(max)'), 1, 1, '') منو راهنمایی کنین
و سوال بعدی اینکه ما کجا گفته ایم که
1-رکورد تکراری نشان ندهد
2- در یک ردیف کنار هم بچیند؟
با تشکر

azadeh_1510
شنبه 10 اسفند 1392, 08:40 صبح
ببخشید کسی میتونه راهنمایی کنه؟کلا همیشه انقدر با تاخیر جواب داده میشه؟