\

Facebook


แสดงบทความที่มีป้ายกำกับ sql server แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ sql server แสดงบทความทั้งหมด

วันอังคารที่ 22 สิงหาคม พ.ศ. 2560

วิธีปลด Table Lock ใน SQL SERVER 2008R2


เคยเจอไหม เวลา SELECT ข้อมูลจาก database เเล้วมันหมุนไม่หยุด ไม่ใช้เพราะ query ทำงานนานเเต่อาจเป็นเพราะ table กำลังโดน lock กล่าวคือ process ก่อนหน้านั้นยังทำงานไม่เสร็จ ผู้ใช้คนอื่นจึงยังแตะต้อง ตารางนัน้ไม่ได้ แล้ววิธีปลด lock ต้องทำยังไงหล่ะ

กันก่อนแก้ 

ป้องกันการล็อกตารางในโดยใช้คำสั่ง WITH (NOLOCK) ถ้าใช้  SQL Server 2008R2 ก็ใช้คำสั่งสั้นๆ (NOLOCK) ตามหลังการ SELECT ยกตัวอย่างเช่น


SELECT TOP 100 * FROM dbo.product WITH (NOLOCK)


ถ้าล็อคไปแล้วแก้ไขโดย ค้นหาก่อนว่ามี PROCESS ไหนจองอยู่จากตาราง sys.dm_tran_locks เช่น


SELECT * FROM sys.dm_tran_locks

  WHERE resource_database_id = DB_ID()

  AND resource_associated_entity_id = OBJECT_ID(N'dbo.product');


ถ้ามี record เเสดงว่า process จอง Table อยู่ จัดการมันซะ มองหา process ID แล้วรันคำสั่ง


KILL {PROCESS_ID}

ลองซีเล็กอีกที พบว่าไม่เหลือเร็คคอดละ
จบงาน

วันพฤหัสบดีที่ 1 ตุลาคม พ.ศ. 2558

เทคนิคง่ายๆในการแสดงข้อมูลประเภทการเงิน การบัญชี ใน SQL SERVER


ในเรื่องเงินๆทองๆ หน่วยที่น้อยที่สุดคือ 1 สตางค์ (ทศนิยมสองตำแหน่งจะได้ 0.01) และ SQL SERVER ได้สร้างประเภทข้อมูลทางราคาไว้ให้ใช้งานง่ายๆแล้วคือ DECIMAL แต่การคำนวนจริงๆได้ข้อมูลที่ละเอียดกว่า 2 ตำแหน่งอยู่แล้ว ตัวอย่างง่ายๆก็เช่น อยากได้ค่าภาษี(6.3%) กับสินค้า 1295 บาท จะได้ 81.585 คำถามคือ 0.005 ที่เกินมาเราจะทำยังไง

ปล.ตอนรับเรทภาษีมูลค่าเพิ่มใหม่จาก 7% เป็น 6.3% ที่เริ่ม 1 ตุลานี้ เลยเขียนบทความนี้เป็นตัวอย่างซะเลย

เราก็จะปัดขึ้นหรือปัดลงตามปกติ แต่เมื่อสินค้ามีเพิ่มเป็นร้อย เป็นพันชิ้น มันจะเริ่มเห็นความเเตกต่างของเงินที่คำนวนได้ ก็เงินที่จ่ายจริงๆ ในภาษาโปรแกรมเราสามารถเก็บค่าก่อนปัดเศษเพิ่อเอาไว้คำนวนต่อมีฟังชั่นประมาณนี้

ROUND() คือการปัดขึ้นถ้าเศษสุดท้ายมากกว่า 5 และปัดลงถ้าเศษน้อยกว่า 5 สามารถกำหนดความละเอียดของตำแหน่งทศนิยมได้
SELECT ROUND(81.585, 3, 2)
-- 81.585

แล้วยังกำหนดความละเอียดของหลักที่จะเริ่มปัดได้ เช่น
SELECT ROUND(81.585, 2)
-- 81.590

FLOOR() คือการปัดลงทุกกรณี
SELECT FLOOR(81.585)
-- 81

CEILING() คือการปัดขึ้นทุกกรณี
SELECT CEILING(81.585)
-- 82

อีกเทคนิคหนึ่งคือการ CAST หรือการเปลี่ยน TYPE ของตัวเลขซะเลย ซึ่งจริงๆแล้วมันคือการ ROUND() ก่อน CAST() เช่น
SELECT CAST( 0.0453 AS DECIMAL(10,2))
--0.05
*จะเห็นว่าเศษโดนปัดก่อนแปลงเป็นทศนิยม 2 หลัก

ถ้าคุณเขียนโปรแกรมเกี่ยวกับฟังชั่นคำนวนบัญชีคงจะมีประโยชน์อยู่ไม่น้อย เพราะงานเหล่านี้ทุกทศนิยมต้องเปะๆเท่ากัน ห้ามมีตกหล่น แล้วการปัดเศษง่ายๆนี้แหละที่ทำให้พลาดกัน

วันจันทร์ที่ 25 สิงหาคม พ.ศ. 2557

SQL SERVER ERROR: 40 บันทึกการพังของเอสคิวแอลเซิฟเวอร์

SQL SERVER ERROR : 40 - Could not open connection to SQL Server

ใครเจอ error code 40 ในตัว SQL SERVER เหมือนผม โดยข้อความข้อผิดพลาดเป็นตามรูปนี้เลยครับ


หมายความว่า service ที่ใช้สร้าง connection ยังไม่ถูกเรียกขึ้นมาทำงาน โดยปกติมันก็ขึ้นอัตโนมัติแหละ เเต่ผมอาจปิดโปรแกรมผิดวิธี(End Task) หรือลงโปรแกรมแปลกๆ หรือมือเผลอไปปิดเซอร์วิสตัวนี้ตอนกินแรมมหาศาลเอง ทางเเก้คือ

เข้าไปที่ Service โดย Wiindows 8 สามารถเรียก start menu > พิมพ์ service 
หรือจะเข้า My Com > manage >  Service And Application > Service
เพื่อเเสดงหน้าต่าง Service ขึ้นมา คลิกขวาที่

- SQL SERVER (SQL EXPRESS) เพื่อ Run
- SQL Server Browser เพื่อ Run

วันพฤหัสบดีที่ 27 มีนาคม พ.ศ. 2557

[SQL] Remove View - SQL SERVER 2008R2 วิวทั้งหลายจงหมดสิ้นไป



ชุดคำสั่งสำหรับล้าง view ทั้งหมดที่อยู่ใน folder "View" ด้วย SQL SERVER 2008R2 , เริ่มต้นจาก connect databe ก่อนเเล้วเริ่มต้น Transact-SQL หน้าใหม่ copy code ด้านล่างนี้ ลงไปวางเเล้วกด  F5 เพื่อรันโค๊ดทั้งหมด แล้ววิวของท่านจะถูกล้างจนหมดสิ้น

DECLARE @viewName varchar(500)
DECLARE cur CURSOR
      FOR SELECT [name] FROM sys.objects WHERE type = 'v'
      OPEN cur

      FETCH NEXT FROM cur INTO @viewName
      WHILE @@fetch_status = 0
      BEGIN
            EXEC('DROP VIEW ' + @viewName)
            FETCH NEXT FROM cur INTO @viewName
      END
      CLOSE cur
      DEALLOCATE cur

หายหมดจริงๆนะครับ ถ้าไม่มั่นใจ แนะนำให้ back up วิวก่อนเเล้วค่อยเริ่มทำการลบ

May be like this posts