PDA

View Full Version : سوال: اضافه كردن يك ستون به View



mgh64120
دوشنبه 07 دی 1388, 18:49 عصر
با عرض سلام و خسته نباشيد.
من يه View دارم كه شامل يك فيلد مانده است و داراي مقادير مثبت و منفي و صفر ميباشد و ديتاتايپ اون (Data Type) از نوع پولي (Money) است. حال ميخوام يه فيلد(column) بهش اضافه كنم اگه مقدار موجود در فيلد مانده مثبت بود مقدار فيلد برابر بدهكار و درصورت منفي بودن بستانكار و در صورت صفر بودن عبارت بي حساب نشون داده بشه.
البته من از طريق Cursor اين كار رو انجام دادم ولي يه مقدار سرعتش پايينه !
اگه روشي ديگه هست ممنون ميشم از راهنماييتون!
راستي من نسخه 2000 استفاده ميكنم.
:متفکر:

AminSobati
دوشنبه 07 دی 1388, 19:48 عصر
سلام دوست عزیزم،
چرا از Case استفاده نمیکنین؟

محمد سلیم آبادی
دوشنبه 07 دی 1388, 21:26 عصر
سلام دوست عزیز،
چرا از روش JOIN استفاده نمی کنین؟
یا اینکه از Computed Column؟



declare @case table (i int, name nvarchar(10))
insert @case values(0, N'بی حساب'),(1, N'بدهکار'),(-1, N'بستانکار')

declare @t table (i int)
insert @t values(1),(0),(-1),(10),(-10)

select t.i, c.name
from @case as c
join @t as t
on Sign(t.i)=c.i

/*
i name
----------- ----------
0 بی حساب
1 بدهکار
10 بدهکار
-1 بستانکار
-10 بستانکار
*/

mgh64120
سه شنبه 08 دی 1388, 16:39 عصر
سلام
ميخواستم بدونم كه در Sql2000 ميشه به همين كوئري كه فيلد بدهكار و .. رو اضافه كردين يه فيلد اضافه كرد كه به ركورد اول عدد يك و ركورد دوم عدد دو و ... اختصاص بده (بصورت Primary Key).
متشكرم !
:متفکر:

AminSobati
سه شنبه 08 دی 1388, 22:40 عصر
اگر اشتباه نکنم منظورتون Rank دادن هست؟

http://www.barnamenevis.org/forum/showthread.php?t=11186
http://www.barnamenevis.org/forum/showthread.php?t=17242

محمد سلیم آبادی
چهارشنبه 09 دی 1388, 01:22 صبح
سلام
ميخواستم بدونم كه در Sql2000 ميشه به همين كوئري كه فيلد بدهكار و .. رو اضافه كردين يه فيلد اضافه كرد كه به ركورد اول عدد يك و ركورد دوم عدد دو و ... اختصاص بده (بصورت Primary Key).
متشكرم !
:متفکر:

از چند طریق می توانین به این نتیجه برسین، به برخی از آنها اشاره می کنم.

1. استفاده از تابع Identity Into

2.استفاده از Assignment UPDATE (البته اگر این syntax در 2000 پشتیبانی شود) این روش ابداعی خودم هست.

3. Correlated Scalar Subquery

4. Non-Equal Self Join

5. روش جناب small_programmer (http://www.barnamenevis.org/forum/member.php?u=8778) روش ایشون استفاده از خصیصه ی IDENTITY است. که در نوع خود خیلی جالبه.

روش های 3 و 4 قابل استفاده در view هستند (بدلیل set-based بودن)

روش Assignment UPDATE:



set nocount on
--==========================
declare @t table (i int);
insert @t values(100);
insert @t values(0);
insert @t values(-1);
insert @t values(-10);
insert @t values(+10);
--==========================
declare @i int;
set @i=0;
--==========================
declare @r table (id int, i int, n nvarchar(15));
--==========================
;with c1 (i, n, id) as
(select 0, N'بی حساب', 1 union all
select 1, N'بدهکار', 1 union all
select -1, N'بستانکار', 1),
c2 (i, n) as
(select t.i, c.n
from c1 as c
join @t as t
on Sign(t.i)=c.i)
insert into @r (i, n)
select *
from c2
order by c2.i desc
--==========================
update @r
set id = @i,
@i= @i+1
output inserted.id,
inserted.n,
inserted.i
--==========================

محمد سلیم آبادی
چهارشنبه 09 دی 1388, 02:48 صبح
با عرض سلام و خسته نباشيد.
من يه View دارم كه شامل يك فيلد مانده است و داراي مقادير مثبت و منفي و صفر ميباشد و ديتاتايپ اون (Data Type) از نوع پولي (Money) است. حال ميخوام يه فيلد(column) بهش اضافه كنم اگه مقدار موجود در فيلد مانده مثبت بود مقدار فيلد برابر بدهكار و درصورت منفي بودن بستانكار و در صورت صفر بودن عبارت بي حساب نشون داده بشه.
البته من از طريق Cursor اين كار رو انجام دادم ولي يه مقدار سرعتش پايينه !
اگه روشي ديگه هست ممنون ميشم از راهنماييتون!
راستي من نسخه 2000 استفاده ميكنم.
:متفکر:

تونستین مشکلتون رو با روش من حل کنین؟
در اولین پستم به جای متغیر جدولی از عبارت های جدولی cte و یا derived table استفاده کنین تا بتوانین از آن در view استفاده کنین.
برای این منظور به کد پست قبلیم رجوع کنین.

AminSobati
چهارشنبه 09 دی 1388, 12:09 عصر
روش دوم رو لقب Quirky Update هم بهش دادن (http://www.simple-talk.com/sql/learn-sql-server/robyn-pages-sql-server-cursor-workbench/) و نکته قابل توجه این هست که در سیستمهایی دارای بیش از یک پردازنده مستعد بروز مشکل هست، چون عملیات Assignment پارالل میشه و از طرفی کار همزمان کاربرها روی جدول مشکل ایجاد میکنه، لذا استفاده از TABLOCKX و MAXDOP ضروری هست

محمد سلیم آبادی
جمعه 11 دی 1388, 15:10 عصر
روش دوم رو لقب Quirky Update هم بهش دادن (http://www.simple-talk.com/sql/learn-sql-server/robyn-pages-sql-server-cursor-workbench/) و نکته قابل توجه این هست که در سیستمهایی دارای بیش از یک پردازنده مستعد بروز مشکل هست، چون عملیات Assignment پارالل میشه و از طرفی کار همزمان کاربرها روی جدول مشکل ایجاد میکنه، لذا استفاده از TABLOCKX و MAXDOP ضروری هست

http://barnamenevis.org/forum/showthread.php?t=189122&highlight=assignment+update
خوب بود بیشتر راجب به چگونگی پیدایش این اصطلاح صحبت می کردین.

http://barnamenevis.org/forum/showthread.php?t=189346&highlight=assignment+update
یعنی این نوع دستورات که ویژگی all-at-once دارند ممکن است در پردازنده های چند هسته ای نتیجه ی مورد نظر را ندهند؟ تا حالا با نمونه عینی مواجه شده این؟ امکان دارد لینک مستند و مرجع صحبت های خود را در اینجا قرار دهین؟

AminSobati
جمعه 11 دی 1388, 16:29 عصر
موضوع Parallelism انحصارا برای Assignment Update مطرح نیست. مایکروسافت بصورت یک بحث کلی که روی چند موضوع (از جمله دستورات DML) سایه میندازه Document کرده. Parallelism در Aggregate Functionها هم با ملاحظاتی باید انجام بشه و اگر نه نتیجه اشتباه خواهد بود! (در مورد Built-in Aggregate Function خود SQL Server این ملاحظات رو داره مگر اینکه User Defined Aggregate Function نوشته باشید که وظیفه کنترل Parallelism به عهده شماست).
در مورد Quirky Update و Parallelism دیدن این لینکها آموزنده خواهد بود:

http://semssug.sqlpass.org/Forum/tabid/1369/forumid/37/threadid/109/scope/posts/Default.aspx
http://ask.sqlservercentral.com/questions/826/the-fifo-stock-inventory-sql-problem
http://www.sqlservercentral.com/Forums/Topic803886-338-2.aspx