PDA

View Full Version : ایجاد یه الگو مناسب برای SP



sn_tondar
شنبه 09 دی 1391, 19:34 عصر
چند تا جدول دارم با تعداد فیلد متفاوت
میخوام SP الگو ایجاد کنم
که مثلا برای INSERT اسم جدول پاس داده بشه امابرای هر جدول درSP به تعداد فیلدای اون جدول پارامتر تعریف بشه
مثلا اگه جدول 1 دارای فیدای (,...ID,NA,MS) به صورت پویا پارامترهای P1@,P2@,P3@,...برای ولیو تعریف بشه
وبرای جدول بعد به تناسب خودش

یا برای سرچ اگه جدولی یک کلید و در جدول دیگه کلید اصلی ترکیبی از 2فیلده بصورت پویا عمل کنه شرط رو روی ترکیب این دو فیلد بزاره!

ایا دادن چنین پویای به SP امکان پذیره؟
اگه کسی بلده لطفا راهنمایی کنه با مثال

یوسف زالی
شنبه 09 دی 1391, 21:49 عصر
سلام. بله می شه.
باید با Sys.Objects درگیر بشید.
کمی در این مورد مطالعه کنید.

یوسف زالی
یک شنبه 10 دی 1391, 10:44 صبح
select *
from sys.objects

select *
from sys.tables

select *
from sys.columns

select *
from sys.foreign_keys

select *
from sys.identity_columns

select *
from sys.key_constraints



شما نگاهی به اینها بندازید. هر جا مشکل داشتید بگید.
با داشتن نام جدول می تونی اطلاعات کاملی از ساختارش داشته باشی.
بعد از همه این ها باید با داینامیک کوئری به خواستتون برسید.

محمد سلیم آبادی
چهارشنبه 13 دی 1391, 21:09 عصر
این پست به جهت درخواست کاربر مبنی بر همفکری ارسال شده است
همانطور که در پست قبلی هم اشاره شد شما میتونید کد تولید پروسیجر درج و ... را بسادگی با کمک جداول سیستمی مثل INFORMATION_SCHEMA.COLUMNSو INFORMATION_SCHEMA.TABLES بسازید و محتوای آن را داخل یک متغیر رشته ای درج کرده و با کمک execute کد را اجرا کنید.
برای ساخت یک پروسیجر درج، شما نیاز به نام ستونها، نوع ستون ها و طول آنها دارین که با همون جداولی که گفتم میشه به این داده ها دسترسی پیدا کرد.
من وارد جزئیات نشدم ولی با همین تکه کد میشه قسمت INSERT رو تولید کرد:

declare @string varchar(1000)='';

select @string+='insert into ' + cast(d.name as varchar(20)) +
'(' + stuff(c1.l1,1,1,'') + ')' +
' values(' + stuff(c2.l2,1,1,'') + ');'
from (select name,object_id
from sys.objects
where type = 'U'
/*and name =*/ )d
cross apply (select ltrim(','+name+'')
from sys.columns sc
where sc.object_id = d.object_id
order by column_id
for xml path(''))c1(l1)
cross apply (select ltrim(',@'+name+'')
from sys.columns sc
where sc.object_id = d.object_id
order by column_id
for xml path(''))c2(l2);

select @string
--execute @string

sn_tondar
چهارشنبه 13 دی 1391, 22:59 عصر
چقدر جالبه که میشه در زمان کوتاه این رشته ها رو با استفاده از sys.objects تولید کرد هر چند در تعداد جداول بالا طول رشته جواب نمیده، کاری که من با استفاده از جمع فیلدهای بصورت رشته در کرسر با استفاده از INFORMATION_SCHEMA.COLUMNS انجام دادم
اما چند سوال
1- موقع فراخوانی پروسیجر با توجه به اینکه هریک از این فیلدها دیتا تایپ مخصوص به خود رو دارند و مثلا من در پروسیجر اینطور پارمتر تعریف میکنم@COL_name VARCHAR(50) به مشکل برخورد میکنه که دیتا تایپ رشته هست ایا لازم نیست پارامتر ها در ولیو castبشن؟

2- وقتی مثلا این ارور در مورد فیلدی میاد
Msg 271, Level 16, State 1, Procedure USP_MY_INS_Purchasing_PurchaseOrderDetail, Line 1
The column "LineTotal" cannot be modified because it is either a computed column or is the result of a UNION operator.

یعنی چی؟ یعنی این فیلد قابل ابدیت یا اینذرت نیست یا ؟مشکل چیز دیگه ای هست ؟

3-موقع ساخت این کد باید به identity بودن یا کلید بودن فیلد خصوصا در ابدیت و اینذرت توجه بشه یا نه؟ ایا باید این فیلدها در لیست ابدیت یا اینذرت قرار بگیرن یا نه؟

محمد سلیم آبادی
چهارشنبه 13 دی 1391, 23:50 عصر
هر چند در تعداد جداول بالا طول رشته جواب نمیده
حتی اگه طول رشته رو MAX در نظر بگیریم؟
پاسخ 1: شما مگه قرار نیست که کل پروسیجر رو خودکار تولید کنید؟ این پارامتر ورودی هم بطور اتومات تولید میشه. در واقع عین data type ستون ها رو اونجا قرار میدین.
پاسخ 2: پیغام میگه ستون های محاسباتی خودشون مقدار دهی میشن شما لازم نیست که مقدار بهش بدین. که حق هم داره.
پاسخ 3: دو حالت وجود داره یکی اینکه خصیصه identity_insert (یا شایدم insert_identity) رو قبلش on کنید (که این کار صحیح نیست چرا که ممکن است تداخل بین مقادیر بوجود بیاد) یا اینکه ستون های Identity رو در لیست values قرار ندین، که برای اینکار باید تشخیص داد که کدوم ستون دارای این خصیصه هست که فیلتر بشه. پس باید در کنار این کار ستون های محاسباتی هم فیلتر بشن.

ایا باید این فیلدها در لیست ابدیت یا اینذرت قرار بگیرن یا نه؟
ما نباید مقادیر این ستون ها رو دستکاری کنیم

sn_tondar
پنج شنبه 14 دی 1391, 00:47 صبح
1-حتی max
The name 'insert into'...' is not a valid identifier
2-درسته خودکار ولی نفهمیدم منظورتون رو!
ما این رشته رو تولید کردیم.. اما رشته ای هم از تعریف پرامتر ها باید داشته باشیم در پروسجر ؟!
3- خب چطور فیلدهای محسباتی و ایدنتیتی فیلتر بشن روش شناسایی به چه صورته که بتونم فیلتر کنم.
آ-یا تابع یا شرط خاصی داره؟

select *
from sys.identity_columns
به اینجا مراجعه کردم و لی نفهمیدم چطور شرطش رو ایجاد کنم

محمد سلیم آبادی
پنج شنبه 14 دی 1391, 12:06 عصر
- خب چطور فیلدهای محسباتی و ایدنتیتی فیلتر بشن روش شناسایی به چه صورته که بتونم فیلتر کنم.
آ-یا تابع یا شرط خاصی داره؟

select *
from sys.identity_columns
به اینجا مراجعه کردم و لی نفهمیدم چطور شرطش رو ایجاد کنم
یعنی میخواهین بگین در حد یک not in از SQL بلد نیستین؟
select * from sys.columns sc
where column_id not in
(select column_id
from sys.computed_columns c
where sc.object_id = c.object_id)
and column_id not in
(select column_id
from sys.identity_columns c
where sc.object_id = c.object_id);

sn_tondar
پنج شنبه 14 دی 1391, 13:42 عصر
واقعا ممنون استاد
توجیه نمیکنم ولی ساده یا سخت فرقی نمیکنه مبتدی باشی گاهی جوابم تو دستت باشه استفادشم بدونی بازم میمونی .. دنبال یه چیز خارق العاده ای که فک میکنی بقیه بلدن و تو بلد نیستی
هر کس ذره ای به من بیاموزد مرا بنده خود کرده است .


و اما چند سوال دیگه؟

1- من میخوام این رشته هر بار برای یک جدول ایجاد بشه و شرط رو یک جدول
یعنی هر بار بگیم اگر 'table-name= 'tablename پس ..

2-برای ابدیت و سرچ باید شرط کلید باشه وقتی کلید ترکیبی از چند فیلده باید در where نوشت اگر فیلد 1 =.. and فیلد 2=... و
تا شرط کامل بشه؟
3- فیلدهای عضو کلید اکثرا identityهستند و با اون شرط حذف میشن ..اما کلید های ترکیبی چی
موقع ابدیت و اینذرت میشه فیلدهای عضو کلید رو جزء فیلدهای ابدیت یا اینذرت اورد یا نه ؟
مخصوصا در ابدیت که کلید جز شرط هم هست ..میشه همزمان ابدیت هم بشه؟
4-برای سرچ یا ابدیت کل فیلدها باید در یک مرحله ابدیت یا سرچ بشن یا نه در یک حلق یکی یکی

نمیدونم منظورمو رسوندم یا نه؟
به هر حال اساتید به پای یاد گیری بزارید و جواب بدید ممنون میشم.

محمد سلیم آبادی
پنج شنبه 14 دی 1391, 16:19 عصر
ماشااله چقدر سوال دارین!
شما منو یاد اون داستان شاگرد و استاد میندازین، استاد هر چی از شاگرد میپرسید که اولین حرف از حروف الفبا چیه؟ شاگرد سکوت میکرد. بارها و بارها سوال کرد ولی شاگرد جواب نداد. رفیق شاگرد بهش گفت تو که بلد هستی چرا جواب نمیدی؟! شاگرد گفت اگه حرف اول رو بگم میگه حرف دوم رو بگو همین طور تا آخرین حرف:لبخند:

حالا من یه سوال از شما دارم: چرا میخواهین کاری رو انجام بدین که نمی تونین (معلمومات مورد نیازشو ندارین)؟
تکنیک این بنده خدا (http://barnamenevis.org/showthread.php?377149-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AF%D8%B1%D8%B3-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D9%88%D8%B1%D9%87-%DA%A9%D8%A7%D8%B1%D8%B4%D9%86%D8%A7%D8%B3%DB%8C-%D8%AF%D9%88%D8%B3%D8%AA%D8%A7%D9%86-%D9%84%D8%B7%D9%81%D8%A7-%D8%AC%D9%88%D8%A7%D8%A8-%D8%AF%D9%87%D9%86%D8%AF%28%D8%AF%D8%B1%D8%AE%D9%8 8%D8%A7%D8%B3%D8%AA-%DA%A9%D9%85%DA%A9%29) هم بد نیستا!

sn_tondar
پنج شنبه 14 دی 1391, 17:23 عصر
عجب ... !اون استاده معلومه ادم صابری بوده که بارها و بارها پرسیده با اینکه میدونسته سوالش بیجوابه

و اما سوال شما : خب دارم سعیمو میکنم دنبال معلومات و ربطشون بهم میگردم که یاد بگیرم ...شاید یه روزی همینجا معلومات من به درد کسی بخوره که میخواد همینکارو انجام بده ولی معلوماتشو نداره
به هر حال تا همینجا هم بسیار ممنون استاد
باید فرقی باشه بین شاگرد واستاد:لبخندساده:
برای حرف دوم و ... خدا بزرگه
اگه به برنامه نگاه میکردین متوجه میشدین رشته ها رو تولید کردم با همون شرط هر بار یک جدول با کمک INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.KEY_C OLUMN_USAGE,INFORMATION_SCHEMA.COLUMNS
که به فیلدهای محاسباتی ارور میاد
اینجا م به لطف شما مباحث sys.objects رو تا حدی یاد گرفتم .
منتها الان بیشتر دنبال یه ربطم بین این دوتا
اونجا میشه گفت فیلدا از این جداول .. چون اشنایی زیادی ندارم باsys.columns شرط جدول رو نمیدم چطو اضاف کنم ..
:لبخندساده: