PDA

View Full Version : سوال: بررسی وجود ستون مورد نظر در جدول



AmirAmiri
سه شنبه 13 مهر 1389, 17:56 عصر
سلام خدمت تمامه اساتید گرامی.
من به یه مشکل برخوردم.
برنامه ای نوشتم که بعد از مدتی مجبور شدم توی بانک تغییراتی ایجاد کنم. بعضی از جداول رو تغییر دادم (یک یا چند فیلد اضافه کردم) حالا که نسخه جدید برنامه آماده شده و میخوام ارائه بدم باید فکری به حاله اطلاعات مشتری ها بکنم. به این فکر افتادم که دیتابیس مشتری رو آپدیت کنم و برای اینکار دستوراتی رو در قالب فایل آپدیت نوشتم که Stored Procedures ها رو پاک میکنه و از دوباره CREATE میکنه که ایکار به صورت خودکار انجام میشه اما مشکل من اینه که نمیتونم تشخیص بدم دیتابیس آپدیت شده یا نه و نمیخوام برم توی یکی از جدوال مثلا نسخه دیتابیس رو ثبت کنم تا متوجه آپدیت شدنش بشم. میخوام هر جدولی که تغییر دادم را ALTER کنم و فیلدهای مورد نظرم رو بهش اضافه کنم.

مشکل اصلی : وقتی توی فایل آپدیت دیتابیس میخوام جداول رو ALTER کنم ممکنه به جدولی بر بخورم که قبلا تصحیح شده و فیلد مورد نظرم درونش وجود داره اون وقت دستور زیر ایراد میگیره و خطا میده :

ALTER TABLE tblCustomers ADD Payments# bigint NOT NULL CONSTRAINT Payments# DEFAULT (0)
من نمیخوام هیچ خطایی به وجود بیاد به همین دلیل به دنبال تابعی گشتم که بتونم نام ستون های جدول رو پیدا کنم تا در صورت عدم وجود ستون ، اون رو اضافه کنه.
تابعی که پیدا کردم این بود sp_columns_rowset ولی مشکل اینجاست که این تابع یک جدول میده و نمیتونم حتی ازش SELECT بگیرم تا وجود ستون مورد نظر رو بررسی کنم. از این تابع به این شکل استفاده کردم :

sp_columns_rowset tblCustomers,'',Paymentsحالا از شما کمک میخوام. خیلی ممنون میشم اگر کسی در این زمینه کمکم کنه.

AmirAmiri
چهارشنبه 14 مهر 1389, 12:23 عصر
سلام.
از دیروز تا حالا هیچکی جواب نداده.
خواهش میکنم کمی توجه کنید. یه راهی جلوی پام بزارید که کارم راه بیفته.

بهزادصادقی
چهارشنبه 14 مهر 1389, 14:21 عصر
امیدوارم این کمکت کند.

این کد یک function درست می کند که یک جدول بر می گرداند که اسم و نوع ستون های جدولی که اسم و schema اش را به صورت پارامتر به این function پاس کرده ای را لیست می کند:



if object_id('dbo.ColumnNamesAndTypesForTable') is not null begin
drop function dbo.ColumnNamesAndTypesForTable
end;
GO

create function dbo.ColumnNamesAndTypesForTable
(
@table sysname,
@schema sysname = 'dbo'
)
returns table
as
return
(
select
top 100 percent
p.name ColumnName,
t.name + case
when t.name in ('char', 'nchar', 'varchar', 'nvarchar' )
then '(' + case p.max_length
when -1
then 'MAX'
else case
when t.name in ( 'nchar', 'nvarchar' )
then ltrim( str( p.max_length / 2 ) )
else ltrim( str( p.max_length ) )
end
end + ')'
when t.name in ('decimal', 'numeric' )
then '(' + ltrim( str( p.precision ) ) + ',' + ltrim( str( p.scale ) ) + ')'
else ''
end ColumnType,
p.column_id ColumnNumber
from
sys.columns p
join
sys.types t
on
p.user_type_id = t.user_type_id
join
sys.objects o
on
o.object_id = p.object_id
and o.name = @table
join
sys.schemas s
on
o.schema_id = s.schema_id
and s.name = isnull( @schema, 'dbo' )
order by
p.column_id
);
GO


برای تست کردنش و نحوه فراخوانی آن هم می توانی این را ببینی:



create table MyTable( Col1 int, Col2 int, Col4 nvarchar(10) );
select * from dbo.ColumnNamesAndTypesForTable( 'MyTable', 'dbo' );

AmirAmiri
جمعه 16 مهر 1389, 12:57 عصر
سلام.
دوست عزیز ممنون از زحمتی که کشیدین اما این تابع کاری که من میخوام رو انجام نمیده. در واقع درست کار نمیکنه. نام ستونهایی که میخوام رو برنمیگردونه.
از دوستان کسی میدونه چطوری میشه از Stored Procedure ها Select گرفت؟

بهزادصادقی
جمعه 16 مهر 1389, 14:05 عصر
سلام.
دوست عزیز ممنون از زحمتی که کشیدین اما این تابع کاری که من میخوام رو انجام نمیده. در واقع درست کار نمیکنه. نام ستونهایی که میخوام رو برنمیگردونه.
از دوستان کسی میدونه چطوری میشه از Stored Procedure ها Select گرفت؟

امیر جان

احتمالا نحوه فراخوانی شما مشکل دارد. یعنی حدس می زنم توی نحوه استفاده از این تابع مشکلی داری. خود تابع را من همان طور که هست الان دوباره تست کردم، یعنی کد بالا را از توی این صفحه کپی کردم، توی Management Studio وارد کردم، اجرایش کردم و بعد توانستم با استفاده از این تابع ستون های چند جدول متعدد را لیست کنم. این تابع را من خودم نوشته ام و ماه هاست که دارم ازش استفاده می کنم. می دانم که درست کار می کند.

شما اگر زحمت بکشید و کدی را که با آن این تابع را فراخوانی می کنی اینجا درج کنی، من می توانم مشکل احتمالی را تشخیص دهم و در حلش انشالله کمکت کنم.