Tag SQL Server

[SQL SERVER] วิธีแก้ Error: 15138 – The database principal owns a schema in the database, and cannot be dropped

เมื่อวันก่อนได้งานจากหัวหน้าให้เขียน Script เพื่อจัดการ User กับสิทธิื หลังการ Restore ฐานข้อมูล เมื่อลองเขียนคำสั่งเพื่อ Drop User DROP USER [invest]; พบ Error Message ดังนี้ The database principal owns a schema in the database, and cannot be dropped. (Microsoft SQL Server, Error: 15138) จาก Error Message ด้านบน…

[SQL Server] การสร้าง Function ใช้เองใน Database ของเรา ตอนที่ 2(Scalar-valued Function )

MS SQL

จากบทความที่แล้วที่ผมได้แนะนำเรื่องการสร้างฟังก์ชั่นใช้เองใน Database (User-Defined Function)ของเรา วันนี้ผมมาแนะนำการสร้างฟังก์ชั่นรูปแบบแรก Scalar-valued Function กันนะครับ Scalar-valued Function คือ อะไร Scalar-valued Function คือ ฟังก์ชั่นที่คืนค่าเป็นข้อมูลชนิดพื้นฐานเพียงตัวเดียว เช่น datetime, int ยกเว้นชนิดข้อมูลแบบ text, ntext, image หรือ timestamp ที่ไม่สามารถสั่งให้คืนค่าได้ โดยการเรียกใช้สามารถเรียกใช้แบบเดียวกันกับฟังก์ที่เคยใช้งานมา โดยส่วนชื่อคอลัมน์ที่ต้องการเข้าไป เช่น SUM, Max เป็นต้น การสร้าง Scalar-valued Function ใน MS SQL Server เริ่มสร้าง Function ซึ่งเราสามารถสร้าง Scalar-valued…

[SQL Server] การสร้าง Function ใช้เองใน Database ของเรา ตอนที่ 1(แนะนำ)

MS SQL

ปกติแล้ว DBMS จะมีฟังค์ชั่นพื้นฐานในด้านต่างๆมาให้ในระดับนึงได้ อาทิ เช่น ฟังก์ชั่นด้านตัวเลข ได้แก่ SUM, AVG เป็นค้น ฟังก์ชั่นด้านตัวอักษร ได้แก่ Trim(), Replace เป็นต้น แต่บางครั้งงานบางชนิด ฟังก์ชั่นเหล่านี้ไม่สามารถตอบโจทย์ หรือ Business Rule ที่เราต้องการได้ ซึ่งตัว SQL Server หรือ DBMS ตัวอื่น ได้อนุญาตให้เราสร้างฟังก์ชั่นใช้เองได้ หรือ เรียกว่า User-Defined Function (ผมเน้นไปในตัว SQL Server) โดยสามารถสร้างฟังก์ชั่นได้ 3 ลักษณะ ดังนี้ Scalar-valued Function…

[MSSQL] SQL กับการบวก/ลบวันที่

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

[SQL Server] SELECT เมื่อพบข้อมูลวันที่เป็น 1990-01-01 ให้แสดงเป็น String ว่าง

ปัญหาที่ได้เจอวันนี้ คือ SELECT ข้อมูลวันที่ ที่บาง Record เก็บข้อมูลไม่ได้มีการเก็บข้อมูลวันที่ แต่ผลลัพธ์ที่ได้กลับเป็น 01-Jan-1990 (SQL Server ใจดีใส่ให้) ถ้าหาก User มาเห็นคงตกใจ คิดว่าระบบงานของเราเกิด Defect ชิ้นใหญ่แน่นอน เตรียมข้อมูล กำหนดโครงสร้างตาราง ดังรูป ใส่ข้อมูลคร่าวๆลงไป ดังรูป ความต้องการ แสดงข้อมูลยอด BUY/SELL โดยต้องแสดง TX_ID, PRODUCT_NAME, TX_UNIT, TX_TYPE, TX_TradeDate และ TX_IsConfirm ต้องการให้แถวที่มีข้อมูล Date ข้อมูลวันที่เป็น 1990-01-01 ระบบต้องไม่แสดงผลเป็น 1990-01-01…

[SQL Server] เชื่อหรือไม่ว่า SQL เอาตัวเลขมาลบกันได้

พอดีวันนี้งานที่ทำมีโจทย์ให้ว่าให้หาข้อมูลการซื้อ(BUY) และข้อมูลการขาย (SELL)  ณ ช่วงเวลาหนึ่ง เพื่อหาจำนวนสินค้าที่มีเรามีถืออยู่ (On Hand) ข้อมูลโครงสร้างตารางต่างๆ อ้างอิงจากหัวข้อที่ผ่านมา เตรียมข้อมูล กำหนดโครงสร้างตาราง OrderTx ดังรูป กำหนดข้อมลให้ตาราง ดังนี้ ความต้องการ(โจทย์) จากข้อมูลการซื้อ(BUY) และข้อมูลการขาย (SELL)  ณ ช่วงเวลาหนึ่ง(ระหว่างวันที่ 01-OCT-2013 ถึง 10-OCT-2013) เพื่อหาจำนวนสินค้าที่มีเรามีถืออยู่ (On Hand) วิธีการแก้ปัญหา หากติดความจากโจทย์เราสามารถแบ่งออกเป็น Query ย่อยๆ ได้ดังนี้ หาผลรวม(SUM) ของข้อมูลการซื้อ(BUY)ระหว่างวันที่ 01-OCT-2013 ถึง 10-OCT-2013 หาผลรวม(SUM) ของข้อมูลการขาย(SELL)ระหว่างวันที่…

[SQL Server] SELECT แปลง Column ที่เป็น null ให้เป็น 0

หลายครั้งที่ต้องเจองานในการเขียน SQL ประเภทการหาผลรวม (SUM) ของรายการ ตามเงื่อนไข A, B, C, D และอื่นๆจิปาถะ ลองมาดูตัวอย่างกัน เตรียมข้อมูล กำหนดโครงสร้างตาราง OrderTx ดังรูป กำหนดข้อมูลให้ตาราง ดังนี้ ความต้องการ(โจทย์) มาดูโจทย์ที่เราต้องการ ต้องการหาผลรวมของ Unit เฉพาะรายการขาย(BUY) ที่ยืนยันแล้ว(ISCONFIRM) และมีวันขายสินค้าระหว่างวันที่ 1-Oct-2013 ถึง วันที่ 10-Oct-2013 โดยสามารถเขียน Query ได้ ดังนี้ ปัญหา หากเรามีรายการใหม่ขึ้นมา ได้แก่การ รายการประเภทซื้อเชื่อ(BUY_CREDIT) พอทดสอบ Query พบว่าได้ค่า…

[SQL Server] ปัญหา row cannot be located for updating. some values may have been changed since it was last read

ปัญหา row cannot be located for updating. some values may have been changed since it was last read สาเหตุ เกิดจากการตารางที่โปรแกรม หรือ App ที่เรากำลังพัฒนาได้ถูกใช้งานอยู่ หากใครเคยเรียน DB มา มีศัพท์เทคนิคอีกย่างนึง เรียกว่า Isolation Level นั้นเอง โดยสามารถเกิดได้จาก 2 กรณี ดังนี้ วิธีการแก้ไข กรณีที่ 1: ให้ตรวจสอบตารางที่เกี่ยวข้องกับหน้าจอนั้น ว่ามี Trigger…

[SQL Server] SELECT * From Table where 1 > 2

เวลาทำงานหลายคนอาจจะเจอ SQL แปลก เช่น SELECT * FROM INVESTTX WHERE 1 > 2 Q: WHERE 1 > 2 คือ อะไร ? A: คือ การ SELECT ข้อมูล RECORD เปล่าขึ้นมา เพื่ออัปเดต หรือ ทำเป็น TEMP Table เพื่อการใช้งานต่อไป ตัวอย่างการใช้งาน SELECT RECORD เปล่าขึ้นมา Update Recordset ใน…

[MSSQL] การ Restore Database จากไฟล์ .Bak

ในบางครั้งเวลาที่เราทำงาน อาจจะต้องเอาไฟล์ Database จากที่อื่นมาใช้งาน หาก Detach ออกมาก็ทำให้ Database ตัวเดิมนั้นใช้งานไม่ได้ด้วย ตอนนี้ผมนำเสนอวิธี Restore Database จากไฟล์ .Bak ตามขั้นตอนต่อไปนี้ครับ Login เข้าฐานข้อมูล เลือก Instance ที่ต้องการใช้งาน (ต้องใช้ USER ในระดับ Windows-Authentication) มาที่ Database คลิกขวาเลือก Restore Database ดังรูป มากำหนดค่าเพิ่มเติม ดังนี้ ตรง To Database ให้กำหนดชื่อฐานข้อมูล เมื่อ Restore สำเร็จ จะใช้มือชื่อ…