SQL SERVER 2008

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

توسعه و بهبود DDL برای Trigger
ساعت ۳:۱٤ ‎ب.ظ روز ۱۳۸٧/٩/۳٠  کلمات کلیدی: trigger ، ddl ، sql server 2008 ، rename

 

در sql server 2008 ، trigger ها طوری تغییر کرده اند که از آنها به عنوان DDL میشود استفاده کرد مثلا یک table جدید در آن ساخته شود. با این تغییر انعطاف بسیار بالایی به  trigger ها داده شده است. شمای XML برای رخدادها به عنوان بخشی از database engine در مسیر

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd 

نصب شده و همچنین از آدرس زیر قابل دریافت است.

http://schemas.microsoft.com/sqlserver

خیلی از stored procedure ها اعمال تعریف داده(DDL) انجام میدهند. قبل از sql server 2008 ، شما نمیتوانستید با یک trigger ساختار داده ای جدیدی تعریف کنید. اکنون  شما میتوانید رویدادهایی را راه اندازی کنید که درآنها کارهایی شبیه PROCEDURE انجام دهید. به عنوان مثال، stored procedure با نام sp_rename یک trigger را که در رویداد RENAME جدید ساخته شده است راه اندازی و اجرا میکند. برای نمایش این نوع از trigger، کد زیر یک database  با نام testdb و در آن یک trigger روی رویداد RENAME برای چاپ منبع و جزییات هدف را جهت تست میسازد.

USE master;

GO

IF DB_ID('testdb') IS NOT NULL DROP DATABASE testdb;

CREATE DATABASE testdb;

GO

USE testdb;

GO

CREATE TRIGGER trg_testdb_rename ON DATABASE FOR RENAME

AS

 

DECLARE

  @SchemaName       AS SYSNAME =

    EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'),

  @TargetObjectName AS SYSNAME =

    EVENTDATA().value('(/EVENT_INSTANCE/TargetObjectName)[1]', 'sysname'),

  @ObjectName       AS SYSNAME =

    EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),

  @NewObjectName    AS SYSNAME =

    EVENTDATA().value('(/EVENT_INSTANCE/NewObjectName)[1]', 'sysname');

 

DECLARE

  @msg AS NVARCHAR(1000) = 

N'RENAME event occurred.

SchemaName: ' + @SchemaName + N'

TargetObjectName: ' + @TargetObjectName + N'

ObjectName: ' + @ObjectName + N'

NewObjectName: ' + @NewObjectName;

 

PRINT @msg;

GO

برای تستtrigger کد زیر یک table با نام dbo.T1 با یک ستون که col1 نامیده میشود میسازد و sp_rename را برای تغییر نام ستون به col2 اجرا میکند :

CREATE TABLE dbo.T1(col1 INT);

EXEC sp_rename 'dbo.T1.col1', 'col2', 'COLUMN';

Trigger روی رویداد RENAME فراخوانی شده و پیام زیر را چاپ میکند :

RENAME event occurred.

SchemaName: dbo

TargetObjectName: T1

ObjectName: col1

NewObjectName: col2

 


 
ساختن template برای گزارشات در Reporting Service
ساعت ٢:۱٥ ‎ب.ظ روز ۱۳۸٧/٩/٢٠  کلمات کلیدی: reporting service ، template ، sql server 2008 ، قالب گزارش

شاید برای خیلی ها که با SQL Server Reporting Server کار میکنند این سوال پیش آمده باشد که چگونه میتوان برای گزارشات یک قالب از پیش تعیین شده ساخت؟ این دقیقا شبیه Master Page برای صفحات ASP .NET است. پاسخ این سوال به شرح زیر است:

 

۱- گزارش مورد نظر خود را بسازید. این گزارش باید شامل قسمتهایی باشد که در تمام گزارشات شما تکرار میشود. مثلا اگر در تمام گزارشات شما Header و Footer مورد نیاز است، میتوانید این کار را در قالب خود طراحی کنید.

۲- فایل rdl ساخته شده را با نام مورد نظر در آدرس زیر کپی کنید:

D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\ProjectItems\ReportProject

۳- Visual Studio را باز کنید و یک پروژه Report بسازید.

۴- پس از ساخته شدن پروژه روی پوشه Reports راست کلیک کنید و گزینه Add و سپس New Item را انتخاب کنید. در دیالوگ باز شده باید یک قالب با نام موردنظر خود ببینید. آن راانتخاب کنید.

در گزارش جدید باید تغییراتی که از قبل داده اید را ببینید.

 

نکته - از این روش شما برای ساختن قالب برای Data Source ها هم میتوانید استفاده کنید.


 
تابع GROUPING_ID
ساعت ۱٠:٢٤ ‎ق.ظ روز ۱۳۸٧/٩/۱۸  کلمات کلیدی: تابع grouping id ، cluster ، sql server 2008 ، t-sql

این تابع به شما اجازه میدهد که مجموعه هایی را مشخص کنید که هر کدام از سطور نتایج متعلق به آنهاست. به عنوان ورودی شما تمام مشخصه هایی را که در هر مجموعه دسته بندی شرکت دارند مهیا میکند. تابع یک نتیجه integer که یک bitmap (نقشه بیتی) است را تولید میکند، که در آن هر بیت جایگزین یک مشخصه متفاوت میشود. در این راه تابع یک عدد صحیح یکه برای هر مجموعه دسته بندی تولید میکند.

Query زیر یک مثال از استفاده این تابع را نمایش میدهد:

 

SELECT 

  GROUPING_ID(

    custid, empid,

    YEAR(orderdate), MONTH(orderdate), DAY(orderdate) ) AS grp_id,

  custid, empid,

  YEAR(orderdate) AS orderyear,

  MONTH(orderdate) AS ordermonth,

  DAY(orderdate) AS orderday,

  SUM(qty) AS qty

FROM dbo.Orders

GROUP BY

  CUBE(custid, empid),

  ROLLUP(YEAR(orderdate), MONTH(orderdate), DAY(orderdate));

 

توجه کنید که در خروجی، که در اینجا به صورت مختصر نمایش داده شده، هر مجموعه با یک عدد صحیح یکه جایگزین شده است:

 

grp_id  custid empid       orderyear   ordermonth  orderday    qty

------- ------ ----------- ----------- ----------- ----------- -----------

0       C      3           2006        4           18          22

16      NULL   3           2006        4           18          22

24      NULL   NULL        2006        4           18          22

25      NULL   NULL        2006        4           NULL        22

0       A      3           2006        8           2           10

16      NULL   3           2006        8           2           10

24      NULL   NULL        2006        8           2           10

25      NULL   NULL        2006        8           NULL        10

0       D      3           2006        9           7           30

16      NULL   3           2006        9           7           30

...

به عنوان مثال، عدد 25 جایگزین مجموعه دسته بندی (orderyear, ordermonth) شده است. بیتهای جایگزین عناصری که قسمتی از مجموعه گروه بندی در آن غیر فعال است (ordermonth – 2 و orderyear – 4)، و بیتهایی جایگزین عناصری که قسمتی از مجموعه دسته بندی که فعال هستند، نیستند (orderday – 1, empid – 8, custid – 16) میشوند. عدد 25 از جمع مقادیر جایگزین بیتهایی که فعال هستند به دست می آید یعنی 1+8+16 = 25. این ویژگی مخصوصا وقتی مفید است که شما نیاز دارید که به aggregate ها صورت خارجی بخشید و سپس فقط روی مجموعه های خاص query بزنید. شما میتوانید جدول را با مشخصه grp_id دسته بندی (cluster) کنید که این به SQL Server این امکان را میدهد که به صورت موثر و مفید یک درخواست برای یک مجموعه دسته بندی ویژه را انجام دهد.