Category Archive SQL Server

Import วันที่โดย PHPExcel

ใช้ PHPExcel ดึงข้อมูลออกมา แต่ไม่สามารถ insert เข้า database ได้เลย ลอง debug เอา query string ออกมาดูก็เห็นสาเหตุ เพราะวันที่โดนแปลงจาก 1982-08-05 ไปเป็นตัวเลขประมาณ 3455 ทุก row เลย พอเข้า sql server มันก็ฟ้องมาว่าไม่ใช่วันที่นะ

หาเจอในเน็ต how to get date from excel using PHPExcel library แล้วก็หลายๆที่ ก็ใช้วิธี[code language=”php”]
$cell = $objWorksheet->getCell(‘A2’);
$value = trim($cell->getValue());
/* detect if the cell value is formated to date or not */
if (\PHPExcel_Shared_Date::isDateTime($cell)) {
$value = date(‘Y-m-d’, \PHPExcel_Shared_Date::ExcelToPHP($value));
}
[/code]แต่ผลที่ได้ก็เหมือนเดิม

เกือบจะยอมแพ้แล้วจน ไปเจอคนจุดประเด็นว่า isDateTime มันตรวจโดยใช้ format mm-dd-yyyy ใน PHPExcel detect if the cell value is formated to date or not ลองเทสดูก็จริง เพราะเดิมใช้เป็น format yyyy-mm-dd ลองเปลี่ยนเป็น mm-dd-yyyy ดู สามารถดึงออกมาเป็นวันที่แล้ว ไม่ใช้ int เหมือนเดิม

เพราะว่า sql server มันใช้รูปแบบ yyyy-mm-dd และไม่อยากจะเปลี่ยนไปเปลี่ยนมา เรียงตาม ปี เดือน วัน มันดูง่ายดีแล้ว วันไหนก่อนหลัง ก็ลองหาทางดู จะเปลี่ยนคอนฟิกใหม่ ให้ใช้วันที่แบบ yyyy-mm-dd โดยเพิ่ม[code language=”php” title=”PHPExcel 1=Date 2=Format”]
$objPHPExcel->getDefaultStyle()->getNumberFormat()
->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2);
[/code] โดยมีรูปแบบอื่นๆ ให้เลือกคือ Class: PHPExcel_Style_NumberFormat

ทดลองนำเข้าข้อมูลอีกครั้ง สามารถนำเข้าข้อมูลได้โดยไม่มีปัญหาแล้ว

หล้งจากแก้ข้อมูลแล้วต้องแน่ใจว่าใส่ข้อมูลถูก format เป็น yyyy-mm-dd จริงๆ เพราะว่าตอนเทสเจอใส่ 10/09/1987 มา ค่า value ก่อนแปลงได้ -2208211200 แทนที่จะเป็น 143856000 และหลังแปลงได้ปี 2036-02-16 ไม่ใช่ปี 1987 วันที่มันจะผิดไปหมดเลยครับ อาจจะใช้[code language=”php”]
if (!preg_match(‘/^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$/’, $value)) {
$this->error = true;

$cell->setValue(‘Your date "’. $cell->getValue().’" does not match the YYYY-MM-DD required format.’);
$objWorksheet->getStyle($coordinate)->applyFromArray($this->stylesError);
}
[/code]

อ่านเพิ่มเติม อ่านข้อมูลจาก excel

​ Cannot resolve the collation conflict between​ "Thai_CI_AS" and "Thai_CI_AI"

ดึงข้อมูลจากหลาย database เจอ error

​[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Cannot resolve the collation conflict between “Thai_CI_AS” and “Thai_CI_AI” in the UNION operation.

สาเหตุคือทั้ง 4 database มี table ชื่อเดียวกัน โครงสร้างเหมือนกัน แต่ collation ใช้ ต่างกัน แถมตรวจดูตารางอื่นๆ ก็ใช้กระจัดกระจาย Thai_CI_AI บ้าง Thai_CI_AS บ้าง ดีที่เจอ query ที่แก้ให้ได้ง่ายๆ เอามาดัดแปลงอักนิดให้เรียงตามชื่อตารางก็ใช้ง่ายเลย

[code language=”sql”]
DECLARE @collate SYSNAME
SELECT @collate = ‘Thai_CI_AS’
SELECT
‘[‘ + SCHEMA_NAME(o.[schema_id]) + ‘].[‘ + o.name + ‘] -> ‘ + c.name AS a
, ‘ALTER TABLE [‘ + SCHEMA_NAME(o.[schema_id]) + ‘].[‘ + o.name + ‘]
ALTER COLUMN [‘ + c.name + ‘] ‘ +
UPPER(t.name) +
CASE WHEN t.name NOT IN (‘ntext’, ‘text’)
THEN ‘(‘ +
CASE
WHEN t.name IN (‘nchar’, ‘nvarchar’) AND c.max_length != -1
THEN CAST(c.max_length / 2 AS VARCHAR(10))
WHEN t.name IN (‘nchar’, ‘nvarchar’) AND c.max_length = -1
THEN ‘MAX’
ELSE CAST(c.max_length AS VARCHAR(10))
END + ‘)’
ELSE ”
END + ‘ COLLATE ‘ + @collate +
CASE WHEN c.is_nullable = 1
THEN ‘ NULL’
ELSE ‘ NOT NULL’
END
FROM sys.columns c WITH(NOLOCK)
JOIN sys.objects o WITH(NOLOCK) ON c.[object_id] = o.[object_id]
JOIN sys.types t WITH(NOLOCK) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE t.name IN (‘char’, ‘varchar’, ‘text’, ‘nvarchar’, ‘ntext’, ‘nchar’)
AND c.collation_name != @collate
AND o.[type] = ‘U’
ORDER BY a
[/code]เอาผลลัพธ์ ใน column ที่ 2 ไป execute อีกครั้งก็ใช้ได้

ขอบคุณ Cr: Devart สำหรับคำตอบใน how to change the collate to all the columns of the database?

constraint check / nocheck

บางครั้งการที่ต้องใส่ข้อมูลลง sql server ครั้งละเยอะๆ หรือเป็น data ที่ export มาจากโครงสร้างเดิม อาจจะมีปัญหากับการตรวจสอบ constraint อย่างน้อยถ้า import ใส่ข้อมูลไปเยอะๆ มันก็ต้องใช้เวลาตรวจสอบข้อมูล ทำให้ช้าบ้างละ วิธีแก้คือปิดไปก่อน แล้วค่อยเปิดมันมาใหม่

query ตัวนี้เป็นตัวที่จะ generate sql ออกมาแก้เล็กน้อยตรง check หรือ nocheck และ is_not_trusted ก็จะใช้ได้ทั้งการปิดและเปิด constraint[code language=”sql”]
​select
‘alter table ‘ + quotename(s.name) + ‘.’ + quotename(t.name) + ‘ with check check constraint ‘ + fk.name +’;’
from
sys.foreign_keys fk
inner join
sys.tables t
on
fk.parent_object_id = t.object_id
inner join
sys.schemas s
on
t.schema_id = s.schema_id
where
fk.is_not_trusted = 1
[/code]หลังจาก execute​ แล้วยังไม่มีผลครับต้อง copy ผลลัพธ์ใน Results ที่จะออกมาประมาณ[code language=”sql”]
alter table [dbo].[areas_cities_lang] with check check constraint FK_areas_amphur_lang_areas_amphur;
alter table [dbo].[areas_countries_lang] with check check constraint FK_areas_countrys_lang_areas_countrys;
alter table [dbo].[areas_geography_lang] with check check constraint FK_areas_geography_lang_areas_geography;
alter table [dbo].[areas_provinces] with check check constraint FK_areas_province_areas_geography;
alter table [dbo].[areas_provinces_lang] with check check constraint FK_areas_province_lang_areas_province;
[/code] ไป execute อีกครั้งหนึ่ง บางตารางมันไม่ยอม ต้องไปแก้ทีละตาราง แต่ยังไงก็เร็วกว่ามาเขียน query เองแน่นอน

ขอบคุณ Cr.Scott Munro สำรับคำตอบใน How to list out all Foreign Keys with “WITH NOCHECK” in SQL Server

MySql ต่างกับ sql server

อ่านเจอคำถามนี้ใน facebook

อยากทราบว่าถ้าเราเปลี่ยน database จาก mysql เป็น sql server 2008 นอกจากส่วน connect แล้ว โค๊ดเก่าจากmysql จะสามารถใช้ได้เหมือนเดิมไหมครับ (ผมใช้ codeigniter เขียนครับ)

เลยลองยกตัวอย่างดู โดยใช้ PDO แทน function ของแต่ละ database จะได้เห็นได้ชัดเจน

schema_mysql.php สำหรับ mysql[code language=”php” title=”schema_mysql.php”]
<?php
$database = ‘yii2advanced’;

try {
$dbh = new PDO(
‘mysql:host=localhost;dbname=’ . $database,
‘root’,

);
} catch (PDOException $e) {
exit(‘Error!: ‘ . $e->getMessage());
}
$dbh->query(‘SET NAMES utf8’);

switch ($_GET[‘op’]) {
case ‘columns’:{
$table = $_GET[‘table’];

$sql = "SELECT `COLUMN_NAME` AS name
,`DATA_TYPE` AS type
,IFNULL(`CHARACTER_MAXIMUM_LENGTH`, 0) AS maxlength
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ‘" . $table . "’;";
$sth = $dbh->prepare($sql);
$sth->execute();
$results = [];
if ($sth->rowCount() > 0) {
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
array_push($results, $row);
}
echo json_encode($results, JSON_NUMERIC_CHECK);
}
}break;
case ‘tables’:{
$sql = ‘SHOW TABLES IN ‘ . $database . ‘;’;
$sth = $dbh->prepare($sql);
$sth->execute();
$results = [];
if ($sth->rowCount() > 0) {
while ($row = $sth->fetch(PDO::FETCH_COLUMN)) {
array_push($results, $row);
}
}
echo json_encode($results);
}break;
}
[/code] และ schema_sqlsrv.php สำหรับ Microsoft sql server[code language=”php” title=”schema_sqlsrv.php”]
<?php
$database = ‘TPA’;

try {
$dbh = new PDO(
‘sqlsrv:Server=MAGI\SQLEXPRESS;Database=’ . $database
);
} catch (PDOException $e) {
exit(‘Error!: ‘ . $e->getMessage());
}
$dbh->query(‘SET CHARACTER_SET utf8_unicode_ci’);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

switch ($_GET[‘op’]) {
case ‘columns’:{
$table = $_GET[‘table’];

$sql = "SELECT [COLUMN_NAME] AS name
,[DATA_TYPE] AS type
,ISNULL([CHARACTER_MAXIMUM_LENGTH], 0) AS maxlength
FROM TPA.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ‘" . $table . "’;";
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$sth->execute();
$results = [];
if ($sth->rowCount() > 0) {
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
array_push($results, $row);
}
echo json_encode($results, JSON_NUMERIC_CHECK);
}
}break;
case ‘tables’:{
$sql = ‘SELECT [TABLE_NAME] FROM ‘ . $database . ‘.INFORMATION_SCHEMA.Tables;’;
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$sth->execute();
$results = [];
if ($sth->rowCount() > 0) {
while ($row = $sth->fetch(PDO::FETCH_COLUMN)) {
array_push($results, $row);
}
echo json_encode($results);
}
}break;
}
[/code]

ถึงจะพยามออกแบบ extension ตัวนี้ให้ทำงานได้ทุก database แต่แค่การ connection ก็ต่างกันแล้วแต่ละตัวต่างก็มี ตัวเลือกเพิ่มเติมไม่เหมือนกัน อย่าง การเลือกชุดตัวอักษร SET NAMES utf8 และ SET CHARACTER_SET utf8_unicode_ci ใน sql server (ภาษาไทย ภาษาเดียวก็มีให้เลือกกันเหนื่อยแล้วว่าจะใช้ตัวไหน ลองอ่าน LAB TEST : ความแตกต่างของ SQL THAI Collation แต่ละแบบ) จุดนี้พอจะเข้าใจได้เพราะมาจากคนละบริษัทกัน มาจากคนละความคิด

จุดต่อมา mySql ใช้ ` ` แต่ sql server ใช้ [ ] ในการบอกว่านี่คือชื่อเฉพาะนะ วิธีแก้ก็ง่ายๆ อย่าไปใส่มัน ยกเว้นว่าจะไปใช้ชื่อที่ตรงกับศัพท์สงวน (reserved words) เอาไว้ จำเป็นต้องใช้เพื่อให้ตัว database ไม่สับสน

ถ้าต้องต้องเปลี่ยนฐานข้อมูลก็หลีกเลี่ยงคำพวกนี้ไว้ก่อน

คำสั่งเกี่ยวกับโครงสร้างฐานข้อมูล ต่างเจ้าก็ต่างกัน ทั้งชื่อ type และ key บางครั้งชื่อเดียวกันแต่เก็บข้อมูลได้ไม่เท่ากัน การจะดึงข้อมูลโครงสร้างตารางออกมาก็ใช้คำสั่งต่างกัน ในตัวอย่าง switch case ทั้งสองตัวจะเป็นการ query ดูตารางทั้งหมดในฐานข้อมูลและชนิดของฟิลย์ในตารางทั้งหมด ซึ่งไม่ได้ไกล้เคียงกันเลย (นานๆ จะใช้ที ไม่ต้องไปจำมันก็ได้ ยกเว้นคุณจะเขียน curd ใช้เอง)

การใช้ Abstraction Layers แทนที่จะใช้ Vendor Specific Database Extensions หรือที่เรียกกันว่า native driver ที่เป็นของฐานข้อมูลแต่ละตัว เพราะว่าต้องการที่จะใช้คำสั่งเหมือนๆ กัน ไม่ต้องมาคิดว่าฐานข้อมูลแบบนี้ใช้ function ชื่อนี้ เวลาเปลี่ยน ชนิดฐานข้อมูลก็แค่เปลี่ยนตรง connection ก็พอแล้วไม่ต้องเขียนคำสั่งใหม่ แต่จริงๆ แล้วยังไม่มี Abstraction Layers ตัวไหน หรือของ framework ไหน ไม่ว่าจะเป็น codeigniter, yii, laravel แม้แต่ .net หรือ java ที่แปลง sql query แล้วสามารถทำงานได้เหมือนกันกับทุกๆ ตัว แค่ทำได้ 80% ของทั้งหมดในตัวอย่าง pdo ของ sql server ถ้าไม่ระบุ PDO::ATTR_CURSOR เพิ่มเข้าไป มันก็จะไม่รู้เลยว่า query ออกมามีผลลัพธ์ออกมารึเปล่า และถ้าสังเกตุจะมีคำสั่งที่ใช้ตรวจสอบค่า NULL และแทนด้วยค่าอื่นใน MySQL ใช้ IFNULL แต่ SQL SERVER ใช้ ISNULL การทำงาน โครงสร้างเหมือนกัน แต่เขียนไม่เหมือนกัน แทนกันไม่ได้ (:

เชื่อมต่อพีเฮชพีกับ sql server (sqlsrv)

ถึง mysql จะฟรี ดี รับงานหนักๆ ได้ แต่องค์กรหรือบริษัทใหญ่ๆจะเชื่อถือ microsoft sql server มากกว่าคู่บารมี คู่แท้ php & mysql วันนี้เราจะมาทำให้ php connect กับเอสคิวแอล เซิร์ฟเวอร์กัน โดยใช้ driver ตัวใหม่ sqlsrv แทน mssql ที่โดนยกเลิกไป

  1. เช็ค version ของ php ก่อนโดย run command php -v
  2. download Microsoft Drivers for PHP for SQL Server จากเว็บ http://www.microsoft.com โดยตรง เลือก version ให้ตรงกับ php ที่เราใช้
  3. เปิด ตัว driver ขึ้นมา
    • กด yes ยอมรับข้อตกลงซะ คุณจะได้ไปต่อ
    • เลือกโพลเดอร์ที่จะแตกไฟล์ชั่วคราว ยังไม่ใช่ที่ๆ จะติดตั้งโปรแกรมจริง ๆ
    • หลังจาก สร้างไฟล์ใน folder ที่เราเลือกเสร็จแล้วจะมี alert ขึ้นมา แล้วมันจะปิดตัวเองไม่ต้องตกใจ
  4. เข้าไปดูโฟลเดอร์ที่เลือกไว้ จะเห็นไฟล์ เยอะแยะเลย หาไฟล์ที่เลขตรงกับเวอร์ชั่นเดียวกับ php ของเรา เช่น ใช้ php 5.6 ก็เลือกไฟล์ _56 จะเห็นว่ามี 4 ไฟล์ จะสังเกตุว่า มี _nts และ _ts ความหมายก็คือ
    _nts
    ย่อมาจาก Non Thread Safe สำหรับ php ที่ลงแบบ CGI binary
    _ts
    ย่อมาจาก Thread Safe สำหรับ php ที่ลงแบบ Apache module ถ้าใช้ xampp จะใช้ตัวนี้
  5. เปิดโฟลเดอร์เอ็กเท็นชั่นของพีเอชพี xampp จะอยู่ที่ C:\xampp\php\ext คัดลอกไฟล์ที่เราเลือกมา (แค่ 2 ไฟล์) มาวางเพิ่มเข้าไป
  6. เปิดไฟล์ php.ini xampp อยู่ที่ C:\xampp\php\php.ini ค้นหาบรรทัดที่มี extension=
    แล้วเพิ่ม config ไปตามตัวอย่าง[code type=”text” title=”php.ini”]
    extension=php_sqlsrv_56_ts.dll
    extension=php_pdo_sqlsrv_56_ts.dll
    [/code]
  7. ถ้าลง sql server ในเครื่องเดียวกับ apache ให้ไปปิด service “SQL Server Reporting Services” ก่อน และเปลี่ยน startup type เป็น manual ก่อนเพราะมันใช้ port 80 เหมือนเว็บเซิร์ฟเวอร์ เป็นสาเหตุที่ทำให้ apache start service ไม่ได้
  8. restart apache ไปดู phpinfo ถ้ามี pdo_sqlsrv และ sqlsrv ขึ้นมาก็แสดงว่าลงเอสคิวแอล เซิร์ฟเวอร์ไดร์เวอร์สำเร็จ

ล้างข้อมูลลบทุกตารางในฐานข้อมูล

นอกจากการ ลบตารางทั้งฐานข้อมูล SQL Server แล้วในช่วงการพัฒนา อาจจะต้องลบข้อมูลทิ้งทั้งหมด เพื่อทดสอบและแก้ bug

โดยปกติการล้างข้อมูลในเอสคิวแอล เซิร์ฟเวอร์จะใช้คำสั่ง[code lang=”sql”]
TRUNCATE TABLE table_name
[/code]แต่เป็นการทำครั้งละ 1 ตาราง ถ้ามี 20 table ก็จะเสียเวลา แถมต้องลบบางตารางตามลำดับ ถ้าผูกความสัมพันธ์กับตารางอื่นๆไว้ query ชุดนี้จะช่วยลบข้อมูลได้ทั้ง database ไม่ว่าทั้งฐานข้อมูลจะมีกี่ตาราง กี่แรคคอร์ด และตั้ง identity (คล้ายๆ auto increment ใน MySQL) ให้กลับไปที่จุดเริ่มต้น ตั้งแต่ 1 เหมือนตารางใหม่เลย

โปรดตั้งสติก่อนการปฏิบัติการ T-T

[code lang=”sql”]
EXEC sp_MSForEachTable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? DISABLE TRIGGER ALL’

EXEC sp_MSForEachTable ‘DELETE FROM ?’

EXEC sp_MSForEachTable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? ENABLE TRIGGER ALL’
[/code]
และถ้าเปลี่ยน ‘DELETE FROM ?’ เป็น ‘DROP TABLE ?’ ก็จะเป็นการลบตารางออกไป คำสังแบบนี้ใช้กับ view ก็ได้เหมือนกัน ถ้าลบไม่ได้ลองลบข้อมูลออกไปก่อนตามวิธี ลบตารางทั้งฐานข้อมูล SQL Server

จัดคิวรี่ใหม่ใน SQL Server

ถ้าเจอ code ที่ดูยุ่งเหยิงอ่านยาก แค่มองก็พาลจะทำให้เป็นไมเกรน จะเรียกว่า spaghetti code ในฐานข้อมูลก็จะมี query ที่ซ้อนกันหลายชั้น หรือคิวรี่ที่ออกมาจากการที่บรรดาเฟรมเวิร์คต่างๆ สร้างมาให้อัตโนมัติ จะเขียนติดกันเป็นวัชพีช กว่าจะรู้ว่ามันเป็นอะไร ก็ต้องเอามันมาจัดซะก่อน หลายปีก่อนจะใช้บริการ online SQL Formatter อย่าง SQL Formatter for SQL Serve

จนได้มาเจอกับ ชายผู้น่าสงสารแต่รวยน้ำใจ Poor Man’s T-SQL Formatter ความสามารถของ library ชุดนี้คือ จัดรูปแบบ T-SQL ใหม่ โดยสามารถกำหนดเงื่อนไข วรรค์ตอน ขึ้นบรรทัดใหม่ ส่วนต่างๆ ได้เอง และที่สำคัญสามารถใช้เป็นปลั๊กอินได้ในหลายโปรแกรม

  • SQL Server Management Studio (SSMS)
  • Visual Studio
  • Notepad++ โปรแกรมฟรีก็ใช้ได้
  • Command-line ถ้ามีให้จัดเยอะๆ ก็ไม่เป็นปัญหา
  • WinMerge โปรแกรมเทียบโค้ทที่ดีที่สุด
  • ท้ายสุดบนเว็บอย่าง Poor SQL

ตัวอย่างเช่น ถ้าลงใน SQL Server Management Studio โดยใช้ SqlFormatterSSMSAddIn จะมีเมนูเพิ่มขึ้นมาในเมนู tools สามารถคลิกเพื่อปรับรูปแบบ query ที่ใช้อยู่ตอนนั้นได้เลย ถ้าไม่ชอบหรือคิดว่าจัดอีกแบบดีกว่า สามารถคลิกอีกเมนูปรับรูปแบบได้ตามต้องการเลย ของเค้าดีจริงๆ ไม่น่าเชื่อว่าฟรีทุกอย่างเลย

สามารถดูวิธีติดตั้งได้จาก

ลบตารางทั้งฐานข้อมูล SQL Server

ช่วงนี้ มีแก้ ลบ โครงสร้าง database บ่อยมาก จะลบตารางออกแล้ว import จากฐานข้อมูลตัว dev มา บางตารางก็มี relation กับตารางอื่นๆ ยุบยับไปหมด ไม่ยอมให้ลบ หาเจอ query ชุดนี้มันใช่เลย สะดวกมากๆ

โปรดใช้จักรยานในการปฏิบัติการ T-T

[code lang=”sql”]
DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = ‘ALTER TABLE [‘ + tc2.TABLE_NAME + ‘] DROP [‘ + rc1.CONSTRAINT_NAME + ‘]’
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec SP_EXECUTESQL @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

EXEC sp_MSForEachTable ‘DROP TABLE ?’
GO
[/code]

จัด format SQL ใน SQL SEVER

ใน SQL SEVER บางครั้งเราอาจจะต้องแก้ sql statement ยาวๆ ซ้อนกันหลายๆชั้น ถ้าไปจัด format ก่อนโดยใช้ เว็บที่ให้บริการ sql formatter เช่น freeformatter ,SQLFormat Online SQL formatting service จะอ่านคำสั่งง่ายขึ้น

แต่น่าจะดีกว่าถ้าสามารถจัด format ใน SQL Server Management Studio ได้โดยตรงทำได้โดยการโหลด Plug-in Poor Man’s T-SQL Formatter จากเว็บ Architect Shack โดยหลังจากติดตั้งแล้วจะมี เมนู Format T-SQL Code เพิ่มขึ้นมา ถ้าไม่ใช้รูปแบบที่คุ้นเคยสามารถกำหนดรูปแบบที่ถนัดได้ในเมนู T-SQL Formatting Options

นอกจากนี้ ยังมี plug in สำหรับ notepage++ ,WinMerge อีกนะครับ เข้าใจ programmer ,DBA จริงๆ

สามารถดูวิธีติดตั้งได้จาก https://pitt.plusmagi.com/windows-install-error-0x800f0954/