SQL SERVER 2008

تجارب من در رابطه با SQL SERVER

نوع داده جدید HIERARCHYID (وارد کردن (Insert) گره های جدید )
ساعت ٤:٤٤ ‎ب.ظ روز ۱۳۸٧/٧/٢٠  کلمات کلیدی: hierarchyid ، t-sql ، sql server 2008 ، getdescwndant

برای وارد کردن یک گره در یک ساختار درختی ابتدا باید یک مقدار HIERARCHYID برای آن ساخته شود. از متد HIERARCHYID::GetRoot() برای تولید یک مقدار برای گره root استفاده کنید. از متد GetDescwndant برای تولید مقدار زیر یک گره داده شده استفاده کنید. این متد دو مقدار ورودی HIERARCHYID را به صورت اختیاری دریافت کرده  که این دو ورودی جایی را بین خودشان برای گره جدید مشخص میکنند.
توجه داشته باشید که متد بالا تضمین نمیکند که مقدار تولید شده برای HIERARCHYID یکه باشد. برای اجبار کردن تولید یکه باید حتما روی ستون مربوطه یک primary key ، unique constraint و یا unique index تعریف کنید.
به عنوان مثال کد زیر یک stored procedure برای اضافه کردن یک گره به ساختار درختی میسازد :


IF OBJECT_ID('dbo.usp_AddEmp', 'P') IS NOT NULL DROP PROC dbo.usp_AddEmp;
GO
CREATE PROC dbo.usp_AddEmp
  @empid   AS INT,
  @mgrid   AS INT = NULL,
  @empname AS VARCHAR(25),
  @salary  AS MONEY
AS
 
DECLARE
  @hid            AS HIERARCHYID,
  @mgr_hid        AS HIERARCHYID,
  @last_child_hid AS HIERARCHYID;
 
IF @mgrid IS NULL
  SET @hid = HIERARCHYID::GetRoot();
ELSE
BEGIN
  SET @mgr_hid = (SELECT hid FROM dbo.Employees WHERE empid = @mgrid);
  SET @last_child_hid =
    (SELECT MAX(hid) FROM dbo.Employees
     WHERE hid.GetAncestor(1) = @mgr_hid);
  SET @hid = @mgr_hid.GetDescendant(@last_child_hid, NULL);
END
 
INSERT INTO dbo.Employees(empid, hid, empname, salary)
  VALUES(@empid, @hid, @empname, @salary);
GO


کد بالابه اندازه کافی گویا هست که احتیاج به توضیح نداشته باشد. با استفاده از کد پایین میتوانید چندین گره به جدول اضافه کنید :


EXEC dbo.usp_AddEmp @empid =  1, @mgrid = NULL, @empname = 'David'  , @salary = $10000.00;
EXEC dbo.usp_AddEmp @empid =  2, @mgrid =    1, @empname = 'Eitan'  , @salary = $7000.00;
EXEC dbo.usp_AddEmp @empid =  3, @mgrid =    1, @empname = 'Ina'    , @salary = $7500.00;
EXEC dbo.usp_AddEmp @empid =  4, @mgrid =    2, @empname = 'Seraph' , @salary = $5000.00;
EXEC dbo.usp_AddEmp @empid =  5, @mgrid =    2, @empname = 'Jiru'   , @salary = $5500.00;
EXEC dbo.usp_AddEmp @empid =  6, @mgrid =    2, @empname = 'Steve'  , @salary = $4500.00;
EXEC dbo.usp_AddEmp @empid =  7, @mgrid =    3, @empname = 'Aaron'  , @salary = $5000.00;
EXEC dbo.usp_AddEmp @empid =  8, @mgrid =    5, @empname = 'Lilach' , @salary = $3500.00;
EXEC dbo.usp_AddEmp @empid =  9, @mgrid =    7, @empname = 'Rita'   , @salary = $3000.00;
EXEC dbo.usp_AddEmp @empid = 10, @mgrid =    5, @empname = 'Sean'   , @salary = $3000.00;
EXEC dbo.usp_AddEmp @empid = 11, @mgrid =    7, @empname = 'Gabriel', @salary = $3000.00;
EXEC dbo.usp_AddEmp @empid = 12, @mgrid =    9, @empname = 'Emilia' , @salary = $2000.00;
EXEC dbo.usp_AddEmp @empid = 13, @mgrid =    9, @empname = 'Michael', @salary = $2000.00;
EXEC dbo.usp_AddEmp @empid = 14, @mgrid =    9, @empname = 'Didi'   , @salary = $1500.00;