Showing posts with label SQL Server. Show all posts
Showing posts with label SQL Server. Show all posts

Monday, December 21, 2020

Thursday, December 10, 2020

สร้าง INDEX ให้ได้ผล

 ที่มา:www.aware.co.th

หลาย ๆ ท่าน คงมีคำถามในใจว่า ทำไมสร้าง index มาแล้ว ทำไมการดึงข้อมูล (query) ยังช้าอยู่เหมือนเดิม ไม่เห็นจะเร็วขึ้นเลย ทั้งๆ ที่ในตำราก็บอกว่าสร้าง index แล้วจะทำให้ดึงข้อมูลได้เร็วขึ้น พอผมได้เข้าไปดูเลยพบว่าคอลัมน์ที่ทำมาใช้เป็น index มันไม่เหมาะสมนี่เอง ข้อมูลหลักแสนหลักล้านในตาราง แต่ดันเอาคอลัมน์ที่มีค่าที่แตกต่างกันเพียง 7 ค่า (SELECT Distinct Column_Name) มาเป็นทำเป็น index ซะงั้น ซึ่งไม่ถูกต้องตามหลักการเลือกคอลัมน์มาเป็น Index นั่นเอง ทำให้การดึงข้อมูลก็จะยังช้าอยู่เหมือนเดิมครับ

ผมมีเทคนิคง่ายๆ ในการเลือกคอลัมน์เพื่อใช้สร้าง index มาฝากครับ โดยการใช้สูตรตามด้านล่างนี้ครับ

SELECT Distinct Column Name / Number of Rows

หมายถึงให้เรา SELECT Distinct คอลัมน์ที่เราต้องการ (ซึ่งควรจะเป็นค่าที่ไม่ซ้ำและไม่มีค่า Null ปนอยู่) แล้วดูว่า select ได้ทั้งหมดกี่แถว(row) แล้วให้นำไป หาร กับจำนวนแถวทั้งหมดที่อยู่ในตารางนั้นๆ ครับ แล้วดูผลลัพธ์ว่าได้ค่าเป็นเท่าไหร่ ถ้าได้ค่าใกล้ 1 เท่าไร ก็แสดงว่าคอลัมน์นั้นน่าจะนำไปสร้าง index ที่ดีได้ครับ

ตัวอย่างในการเลือกคอลัมน์เพื่อสร้าง index ที่ดี
ถ้าในตารางของเรามีข้อมูล 100,000 แถว และคอลัมน์ที่ต้องการจะนำมาทำเป็น index มีจำนวน 90,000 แถวที่มีค่าไม่ซ้ำกัน
จากสูตรจะได้ว่า 90,000/100,000 = 0.9
0.9 ถือว่าเป็นค่าที่ใกล้ 1 ดังนั้นคอลัมน์นี้เข้าข่ายที่จะนำมาทำ index ที่ดีได้ครับ

ตัวอย่างในการเลือกคอลัมน์เพื่อสร้าง index ที่ไม่ดี
ถ้าในตารางของเรามีข้อมูล 100,000 แถว และคอลัมน์ที่ต้องการจะนำมาทำเป็น index มีจำนวนเพียง 800 แถวที่มีค่าไม่ซ้ำกัน
จากสูตรจะได้ว่า 800/100,000 = 0.008
0.008 ถือว่าเป็นค่าที่ห่างไกลจาก 1 มาก ดังนั้นคอลัมน์นี้ไม่ควรจะนำมาทำ index ครับ ซึ่งกรณีนี้เราควรปล่อยให้การดึงข้อมูลเป็นแบบดึงข้อมูลหมดในตาราง
(Full Table) จะทำให้มีประสิทธิภาพมากกว่าการใช้คอลัมน์นี้มาทำเป็น index ครับ

ส่วนในกรณีที่เราต้องการใช้หลายๆ คอลัมน์ มาสร้างเป็น index ให้พิจารณาเลือกคอลัมน์ที่มีการเรียกใช้บ่อยๆ ในความสัมพันธ์หรือการเชื่อมโยงกันของแต่ละตาราง (join table) ใน SQL Statement ซึ่งส่วนใหญ่ก็มักจะเป็นคอลัมน์เพื่อสร้าง index ที่ดีตามสูตรที่ได้กล่าวไปแล้วครับ

ข้อควรจำ:การที่มี index มากๆ ก็ใช่ว่าจะดีเสมอไป แม้ว่า index จะช่วยให้การดึงข้อมูล (Query) การเปลี่ยนแปลงข้อมูล (Update) และการลบข้อมูล (Delete) ทำได้เร็วขึ้น แต่มันจะไปลดประสิทธิภาพของการเพิ่มข้อมูล (Insert) แทน และการที่มี index จำนวนมาก ก็จะทำให้เปลืองเนื้อที่ในฐานข้อมูลด้วย ดังนั้นเราจึงควรพิจารณาสร้าง index เท่าที่จำเป็นเท่านั้นครับ

 

Thursday, June 25, 2020

วิธีการใช้คุณสมบัติส่วนขยาย (Extended Properties) ใน MS SQL Server Management Studio (SSMS)


Extended Properties เป็นจุดเด่นของ SSMS สามารถนำมาประยุกต์ใช้ได้หลายอย่างเช่น
  • Specify a caption for a table, view, or column.
  • Specify a display mask for a column.
  • Display a format of a column, define edit mask for a date column, define number of decimals, etc.
  • Specify formatting rules for displaying the data in a column.
  • Describe a specific database objects for all users.

ที่เคยใช้คือใส่ข้อมูลอธิบายใน Description ของ แต่ละ Table Column ดูได้จากลิ้งค์นี้
นอกจากนั้นยังสามารถนำมาใช้ได้กับอย่างอื่นได้อีกด้วย

Object ที่ใช้ Extended Properties ได้
  • Database
  • Stored Procedures
  • User-defined Functions
  • Table
  • Table Column
  • Table Index
  • Views
  • Rules
  • Triggers
  • Constraints 
ในที่นี้จะแสดงตัวอย่างดังนี้
 
1.วิธีการสร้าง/ปรับปรุง/ลบ คุณสมบัติส่วนขยาย Add, Update and Drop Extended Properties.
2.วิธีการดึงคุณสมบัติส่วนขยายที่สร้างไว้มาแสดง
3.วิธีการใช้ฟังก์ชัน FN_LISTEXTENDEDPROPERTY()


แนะนำวิธีสร้าง Extended Properties ใน Database ไว้ในที่นี้ 2 แบบ
แบบที่ 1. คลิกขวาที่ Database เลือก Properties แล้วเลือก Extended Properties
               แล้วป้อนค่าที่ต้องการในช่องใต้ Name, Value
               (อย่าลืมว่าในช่อง Name  จะต้องใส่ชื่อที่ไม่ซ้ำกับ ชื่อเดิมที่มีอยู่แล้ว)
               เสร็จแล้วคลิกปุ่ม OK เพื่อบันทึกข้อมูลที่ป้อนไว้




                เมื่อสร้างเสร็จแล้ว ลอง Query เรียกดูด้วยคำสั่ง

SELECT * FROM sys.extended_properties
   
แบบที่ 2. เรียกใช้ Stored Procedure
EXEC   sp_addextendedproperty 'MS_Description', 'Test DB Description'



--เรียกดู Extended Properties เฉพาะ Level ของ Database เท่านั้น
SELECT
   DB_NAME() AS DbName,
   p.name AS ExtendedPropertyName,
   p.value AS ExtendedPropertyValue
FROM
   sys.extended_properties AS p
WHERE
   p.major_id=0 
   AND p.minor_id=0 
   AND p.class=0
ORDER BY
   [Name] ASC

--เรียกดู Extended Properties ทั้งหมดใน Database นั้น
SELECT * FROM sys.extended_properties

--เรียกดู Database
SELECT DB_NAME(database_id) AS [DB Name], database_id  FROM sys.databases
--เรียกดู Schema
select * from sys.schemas
--เรียกดู Table/Column
select * from INFORMATION_SCHEMA.COLUMNS
select *  from sys.tables  


--เรียกดู Column เฉพาะที่มี Description
USE YourDatabase
SELECT
 [Table Name] = i_s.TABLE_NAME,
 [Column Name] = i_s.COLUMN_NAME,
 [Data Type] = i_s.DATA_TYPE,
 [Description] = s.value
FROM
 INFORMATION_SCHEMA.COLUMNS i_s
LEFT OUTER JOIN
 sys.extended_properties s
ON
 s.major_id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME)
 AND s.minor_id = i_s.ORDINAL_POSITION
 AND s.name = 'MS_Description'
WHERE
 OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0
 --AND i_s.TABLE_NAME = 'YourTableName'
ORDER BY
 i_s.TABLE_NAME, i_s.ORDINAL_POSITION

--เรียกดูทุก Object ที่มี Description
SELECT S.name as [Schema Name], O.name AS [Object Name], ep.name, ep.value AS [Extended property]
FROM sys.extended_properties EP
LEFT JOIN sys.all_objects O ON ep.major_id = O.object_id 
LEFT JOIN sys.schemas S on O.schema_id = S.schema_id
LEFT JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id

--เรียกดู Description โดยใช้ Function ชื่อ fn_listextendedproperty
SELECT * FROM ::fn_listextendedproperty ('MS_Description2','Schema','dbo','Table','PageContent','Column','page') 
SELECT * FROM fn_listextendedproperty ('MS_Description2','Schema','dbo','Table','PageContent','Column','page') 
SELECT * FROM fn_listextendedproperty (NULL,'Schema','dbo','Table','PageContent','Column','page') 
SELECT * FROM fn_listextendedproperty (NULL,'Schema','dbo','Table','PageContent','Column',NULL)
SELECT * FROM fn_listextendedproperty (NULL,NULL,NULL,NULL,default,NULL,NULL)
SELECT * FROM fn_listextendedproperty (NULL,NULL,default,NULL,default,NULL,default)
--Add Extended Property (Database Level)
EXEC   sp_addextendedproperty 'MS_Description', 'Test DB Description'
--Update Extended Property (Database Level)
EXEC   sp_updateextendedproperty 'MS_Description', 'Test DB Description2'
--Drop Extended Property (Database Level)
EXEC   sp_dropextendedproperty  'MS_Description'
--Add Table / View Extended Properties
EXEC   sp_addextendedproperty 'MS_Description', 'Test Table Description','Schema', dbo, 'table', 'YourTableName'
EXEC   sp_addextendedproperty 'MS_Description2', 'Test View Description2','Schema', dbo, 'View', 'YourViewName'
--Add Column Extended Properties
EXEC   sp_addextendedproperty 'MS_Description', 'View Column Description','Schema', dbo, 'View', 'YourViewName', 'Column', YourColumnName
EXEC   sp_addextendedproperty 'MS_Description', 'Your Description', 'user', dbo, 'table', 'YourTableName', 'column', YourColumnName
EXEC   sp_addextendedproperty 'MS_Description3', 'Your Description', 'user', dbo, 'table', 'YourTableName', 'column', YourColumnName
EXEC   sp_addextendedproperty 'MS_Description4', 'Your Description', 'Schema', dbo, 'table', 'YourTableName', 'column', YourColumnName
--Add Stored Procedure Extended Properties
EXEC   sp_addextendedproperty 'YourProcedureExtenedPropertyName', 'Test Stored Procedure Description','Schema', dbo, 'Procedure', 'YourStoredProcedureName'
--Add Trigger Extended Properties
EXEC   sp_addextendedproperty 'YourTriggerExtenedPropertyName', 'Test Trigger Description','Schema', dbo, 'Table', 'YourTableName','Trigger','YourTriggerName'

Friday, March 13, 2020

SQL Server, ข้อแตกต่างระหว่าง COALESCE() กับ ISNULL(), เปรียบเทียบ COALESCE() กับ CASE()

COALESCE คือคำสั่งที่ใช้ในการแปลงค่าจาก NULL เป็น ค่าที่ต้องการ

Syntax : COALESCE(expression1,expression2,…n,VALUE)
** VALUE คือค่าที่ต้องการเปลี่ยนเมื่อ expression เป็น NULL เช่น ต้องการให้แปลง NULL เป็น 10 ก็ใส่ VALUE เป็น 10 **

ตัวอย่างที่ 1
COALESCE(NULL,NULL,’show value’) => ผล : show value
COALESCE(1,2,’show value’) => ผล : 1
COALESCE(1,NULL,’show value’) => ผล : 1
COALESCE(NULL,2,’show value’) => ผล : 2

Syntax : ISNULL ( check_expression , replacement_value )

ตัวอย่างที่ 2
where isnull(name,”) <> ”
มีค่าเท่ากับ  where name is not null and name <> ”
มีค่าเท่ากับ  where name <> ”

ตัวอย่างที่ 3
SELECT ISNULL(Weight, 0) FROM tb_DimProduct

ข้อแตกต่างระหว่าง COALESCE() กับ NULL()
1. เมื่อเจอค่า NULL : ISNULL จะแปลงค่าเป็น int แต่ COALESCE เราจะต้องกำหนด data type
2. ISNULL สามารถใช้ได้กับแค่ 2 parameters เท่านั้น ในขณะที่ COALESCE สามารถระบุ parameters ได้มากกว่า 2

เปรียบเทียบ COALESCE() กับ CASE()
— CASE expression:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
ELSE expressionN
— COALESCE expression:
SELECT COALESCE(expression1,expression2,expressionN)

Wednesday, February 26, 2020

ต้องการรู้จำนวน Records ในแต่ละตาราง , MS Sql Server

USE YourDBname
SELECT
      QUOTENAME(sOBJ.name) AS [TableName]
      , SUM(sPTN.Rows) AS [RowCount]
FROM
      sys.objects AS sOBJ
      INNER JOIN sys.partitions AS sPTN
            ON sOBJ.object_id = sPTN.object_id
WHERE
      sOBJ.type = 'U'
      AND sOBJ.is_ms_shipped = 0x0
      AND index_id < 2 -- 0:Heap, 1:Clustered
GROUP BY
      sOBJ.schema_id
      , sOBJ.name
ORDER BY [RowCount] DESC

Sunday, February 2, 2020

SQL Server - Select DateTime Without Minute

SELECT CAST(CONVERT(CHAR(16), GetDate(),20) AS datetime) AS TagDateTime

Monday, December 2, 2019

Returning TOP N Records

Returning only the first N records in a SQL query differs quite a bit between database platforms. Here's some samples

Thursday, November 7, 2019

เรียกดูข้อมูลทุก 15 นาที

ต้องการเรียกข้อมูลที่ลงท้ายด้วยนาที ที่ 0, 15,30 และ 45


แบบเดิม

SELECT Distinct TagDateTime, Column2, Column3
FROM YourTable
WHERE TagDateTime >=@D1 AND TagDateTime <=@D2
       and (DATEPART(minute,tagdatetime) % 15) = 0
        ORDER BY TagDateTime


อีกแบบ

SELECT TagDateTime, Column2, Column3
FROM YourTable
WHERE TagDateTime IN ( SELECT MIN(TagDateTime)
                              FROM YourTable
                              WHERE TagDatetime between @D1 and @D2
                              GROUP BY CONVERT(VARCHAR(8), TagDateTime, 112), DATEPART(HOUR ,TagDateTime),(DATEPART(MINUTE ,TagDateTime)/15)
                      )  

และถ้าต้องการเรียกทุกชั่วโมง

SELECT TagDateTime, Column2, Column3
FROM YourTable
WHERE TagDateTime IN ( SELECT MIN(TagDateTime)
                              FROM YourTable
                              WHERE TagDatetime between @D1 and @D2
                              GROUP BY CONVERT(VARCHAR(8), TagDateTime, 112), DATEPART(HOUR ,TagDateTime)
                      )


Wednesday, December 5, 2018

SQL Server, เรียกดู DataBase ทั้งหมดที่มีอยู่บน Server

SELECT * FROM master.sys.databases

SQL Server, คำสั่งเรียกดู Table ทั้งหมดที่มีอยู่ใน Database

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

แต่ถ้าเรียก View มาด้วยก็ไม่ต้องใส่ WHERE
SELECT * FROM INFORMATION_SCHEMA.TABLES

Monday, August 6, 2018

How to get the list of all database users

SELECT * FROM sys.database_principals where (type='S' or type = 'U')

Monday, July 23, 2018

วิธี Select Description ของ Table ใน SQL Server มา

SSMS ในหน้า Design > Table > Column > ช่อง Description สามารถใส่คำอธิบายที่เกี่ยวข้องกับคอลัมน์นั้นได้


USE [YourDataBaseName]
SELECT
 [Table Name] = i_s.TABLE_NAME,
 [Column Name] = i_s.COLUMN_NAME,
 [Description] = s.value
FROM
 INFORMATION_SCHEMA.COLUMNS i_s
LEFT OUTER JOIN
 sys.extended_properties s
ON
 s.major_id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME)
 AND s.minor_id = i_s.ORDINAL_POSITION
 AND s.name = 'MS_Description'
WHERE
 OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0
 --AND i_s.TABLE_NAME = 'YourTableName'
ORDER BY
 i_s.TABLE_NAME, i_s.ORDINAL_POSITION

Wednesday, December 13, 2017

MS SQL Server Management - Cannot change design

ปัญหา

MS SQL Server Management Studio 2008 R2
แก้ไขโครงสร้างของ Table แล้ว Error ดังรูปข้างล่าง


สาเหตุ

Check Box ช่อง Prevent saving changes that require table re-creation ถูกเลือกอยู่


วิธีแก้ไข

เข้าไปที่ Tools > Options…    
แล้ว เอาเครื่องหมายถูกหน้า Check box: Prevent saving… ออก



Monday, November 27, 2017

แก้ปัญหาไม่แสดงผลตามต้องการเหตุจากบางคอลัมน์ในสูตรเป็น NULL


  • ปัญหาที่พบคือบาง Record นั้น ColumnB ไม่มีข้อมูล (NULL) ทำให้สูตรที่มี ColumnB อยู่ด้วยเป็น NULL ตามไปด้วย แต่ที่ต้องการคือถ้า Record ไหนที่ ColumnB เป็น NULL ก็กำหนดค่าให้มีค่าเป็น 0 ซะ
  • แก้ปัญหาโดยใช้ IsNull มาช่วยเช่น
    • ถ้าเป็นคำสั่งใน SQL Server
      • SELECT YourColumn, ColumnA, ColumnB, IsNull(ColumnA,0)+IsNull(ColumnB,0) As SumAandB FROM YourTable
  • จะได้ผลตามที่ต้องการ
 
  • ถ้าเป็นใน Crystal Report ก็อาจต้องสร้าง Formula fields เพิ่มเช่น 
    • IF IsNull(ColumnB) THEN 0 ELSE ColumnB

Monday, March 20, 2017

Wednesday, September 21, 2016

การเขียน Stored Procedure บน SQL Server


แหล่งข้อมูล http://www.thaicreate.com/tutorial/sqlserver-stored-procedure-create.html

 
ตอนที่ 1 : รู้จักและการเขียน Stored Procedure บน SQL Server (SQL Server : Stored Procedure) ในบทความของไทยครีเอทผมอาจจะไม่ค่อยได้พูดถึง Stored Procedure ซะเท่าไหร่ เพราะในการเขียนโปรแกรมทั่ว ๆ ไป ที่ไม่ต้องการความซับซ้อนมากนัก การเขียน SQL Query ปกติก็สามารถทำงานได้ และในการเขียนโปรแกรมรุ่นใหม่ ๆ ไม่ว่าจะเป็น PHP หรือ .Net Application หรืออื่น ๆ ก็มี Framework ใหม่ ๆ ที่ออกมาช่วยจัดการ ORM(Oreited Relational Mapping) ช่วยการเขียนติดต่อกับ Database นั้นง่ายมาก ยิ่งทำให้การเขียน Stored Procedure นั้นอาจจะไม่ค่อยมีความจำเป็นซะเท่าไหร่ และโดยเฉพาะใน .Net Application ที่ได้รับความนิยมมากในปัจุบัน ยังมี Framework ที่จัดการกับ Database อย่างเช่น LINQ to SQL , LINQ to Entities หรือ Entity Framework Model ที่สนับสนุนการเขียน Coding ทำการ Select, Insert, Update, Delete ในรูปแบบของ Syntax ภาษานั้น ๆ บนโปรแกรมได้เลย โดยไม่ต้องสนใจที่จะเขียน SQL และยังมีประโยชน์เมื่อต้องการเปลี่ยนประเภทของ Database เช่น MySQL, Oracle ก็ไม่ต้องมานั้งทำการแก้ไขหรือเขียน Stored Procedure ใหม่

การเขียน Stored Procedure จะจำเป็นมากในการพัฒนาระบบขนาดใหญ่ ที่มีการจัดเก็บข้อมูลและประมวลผลจำนวนมาก ๆ เพราะการเขียน Query ในปกติ ที่มีการติดต่อกับข้อมูลหลาย ๆ ครั้ง เราจะต้อง Select แล้วใช้โปรแกรมอ่านค่า เมื่ออ่านได้ค่าแล้วค่อยส่งไปประมวลผลที่ Database ซ้ำ ๆ ซึ่งจะเป็นการทำงานซ้ำซ้อน มีการรับส่งระหว่าง Application กับ Database เป็นสิบหรือหลายร้อยครั้ง ซึ่งผลที่ตามมาคือ Performance ของโปรแกรมจะทำงานช้ามาก ทางเลือกในการแก้ปํยหานี้ก็คือ เราใช้การทำงานซ้ำซ้อนทั้งหมดนี้ที่ Database แทน โดยเราเพียงส่งค่า Parameters ที่จำเป็นต้องใช้ จากนั้นบน Database ก็จะนำค่า Parameters ที่ส่งไปนั้น ทำงานตามคำสั่งต่าง ๆ บน Stored Procedure ที่ เราเขียนขึ้น เมื่อได้ค่าที่ต้องการค่อยส่งค่า Result กลับมายังโปรแกรม วิธีนี้จะเป็นการเพิ่มประสิทธิภาพการทำงานของโปรแกรมให้ทำงานเร็วขึ้น และลด Traffic ระหว่าง Database กับ Application ได้สูงมาก

ข้อดีการใช้ Stored Procedure

  • Syntax เขียนง่าย เข้าใจง่าย และในปัจจุบันมี Tools ที่ช่วยให้การ Debug ง่ายมาก
  • เพิ่มประสิทธิภาพการทำงานการ Query Database ได้อย่างดีเยี่ยม ลดภาระการทำงานของ Application
  • ลด Traffic ของ Network หรือระหว่าง Database กับ Application
  • การพัฒนาค่อนข้างจะเป็นระบบ แยกระหว่าง Application Logic กับ Database Logic ได้ชัดเจน เช่น ถ้าต้องการแก้ไข Logic ของ Database อาจจะเพียงแก้ไขที่ Stored Procedure เท่านั้น
ข้อเสียการใช้ Stored Procedure
  • การเขียน Stored จะผูกกกับ Database นั้น ๆ เมื่อเปลี่ยน Database ไปใช้ตัวอื่น จะต้องเขียน Stored ใหม่ทั้งหมด
  • Syntax ของการเขียน Stored Procedure จะไม่เหมือนกัน
  • เมื่อนำไปใช้บน Production Server การ Debug ตรวจสอบหาข้อผิดพลาดทำได้ยากพอสมควร
ตอนที่ 2 : การสร้าง Parameters รับค่าบน Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 3: การ Print และแสดงผลบน Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 4 : การสร้างตัวแปร Declare Variable บน Stored Procedure (SQL Server : Stored Procedure
ตอนที่ 5 : การสร้าง Declare Table สร้างตัวแปรแบบตาราง (SQL Server : Stored Procedure) 
ตอนที่ 6 : การสร้าง Loop ข้อมูลบน Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 7 : การใช้ Cursor บน Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 8 : การใช้ If ....Else If...Else สร้างเงื่อนไข (SQL Server : Stored Procedure) 
ตอนที่ 9 : การใช้ Try Catch บน Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ (SQL Server : Stored Procedure) 
ตอนที่ 11 : การใช้ Transaction เพื่อ Rollback และ Commit (SQL Server : Stored Procedure) 
ตอนที่ 12 : การใช้ Cursor ระหว่าง (Between) Stored Procedure (SQL Server : Stored Procedure) 
ตอนที่ 13 : การ Debug Stored Procedure บน Visual Studio 2010,2012,2013,2015 และอื่น ๆ 
ตอนที่ 14 : การสร้าง View Table บน SQL Server Database (SQL Server : View Table) 
ตอนที่ 15 : การสร้าง Trigger บน SQL Server Database (SQL Server : Trigger) 
ตอนที่ 16 : การสร้าง Function บน Server Database (SQL Server : Function) 
ตอนที่ 17 : PHP เรียกใช้ EXEC/CALL - SQL Server Stored Procedure ด้วย sqlsrv และ pdo 
ตอนที่ 18 : Visual Basic (VB.Net) เรียกใช้ EXEC SQL Server Stored Procedure 
ตอนที่ 19 : Java เรียกใช้ EXEC/CALL - SQL Server Stored Procedure ด้วย (JDBC) 
ตอนที่ 20 : Visual C# (C# .Net) เรียกใช้ EXEC/CALL - SQL Server Stored Procedure 

Monday, April 27, 2015

วิธีแก้ error Database Diagrams

ปกติเมื่อต้องการดู Database Diagrams ก็คลิกว่าที่ Database Diagrams แล้วเลือก New Database Diagram ได้ไม่มีปัญหา แต่มีบาง Database บาง User ที่ขึ้น error ว่า
“Database diagram support objects cannot be installed because this database does not have a valid owner. To continue, first use the Files page of the Database properties dialog box or the ALTER AUTHORIZATION statement to set the database owner to a valid login, then add the database diagram support objects.”

มีวิธีแก้ไขดังนี้
New Query แล้วรันคำสั่งประมาณนี้
ALTER AUTHORIZATION ON DATABASE::databasename TO sa
เช่น
ALTER AUTHORIZATION ON DATABASE::elec TO sa