หรืออีกวิธีก็สั่ง CREATE TABLE ก่อน แล้วก็ INSERT ข้อมูลที่ได้จาก Stored Procedure ซึ่งวิธีนี้ถ้ามันมีหลาย field ตอนสั่ง CREATE TABLE ก็เหนื่อยไม่ใช่เล่น ซึ่งวิธีนี้ใช้บ่อยโดยเฉพาะอย่างยิ่ง stored procedure ของระบบ เช่นพวก sp_who2, sp_lock เป็นต้น ลองดูตัวอย่างครับ
CREATE TABLE #locks (spid int, dbid int, objid int,
indid int, [type] varchar(4), resource varchar(50), mode varchar(2), status varchar(10));
INSERT INTO #locks (spid, dbid, objid, indid, [type], resource, mode, status)
EXEC dbo.sp_lock;
SELECT * FROM #locks;
DROP TABLE #locks;
อันนี้ตัวอย่างแค่ 8 fields ยังเหงื่อตก เพราะเทสกันหลายรอบครับ ทีแรกผมกำหนด datatype ไม่ถูกมันก็ error ใส่ ขนาดน้อยไปเช่น resource varchar(10) ก็ error ครับ
วันนี้ผมมีวิธีใหม่มาเสนอครับ ลองดูโค้ดละกัน
SELECT * INTO #tmpWho FROM OPENROWSET('SQLNCLI', 'Server=testSQLServer;Trusted_Connection=yes;', 'EXEC sp_who') ;
SELECT * FROM #tmpWho Where dbname='master' and loginame = 'sa';
DROP TABLE #tmpWho;
ครับ โค้ดนี้เราใช้คำสั่ง OPENROWSET ร่วมกับ SELECT INTO นั่นเอง สะดวกดีมากทีเดียว 555
คราวนี้มาดูตัวอย่างการใช้งานจริงบ้าง
SELECT * INTO tempTestOutput FROM OPENROWSET ('SQLNCLI', 'Server=testSQLServer;Trusted_Connection=yes;', 'EXEC testDB.dbo.spTestOutput ''testParameter1''');
SELECT t.*, e.Department, e.HiredDate
FROM tempTestOutput t INNER JOIN Employee e ON t.EmployeeId = e.EmployeeId
WHERE e.ResignedDate IS NULL
ORDER BY t.EmployeeId
คราวนี้ผมก็ได้ temp table เอาไว้ยำข้อมูลแล้วครับ เสร็จแล้วก็อย่าลืม DROP TABLE ด้วยนะ
Referrence
www.stackoverflow.com - How to SELECT * INTO [temp table] FROM [Stored Procedure]
1 ความคิดเห็น:
เพิ่มเติมครับ
ถ้าต้องการ Query ครั้งเดียว ไม่อยากเก็บใน temp table ก็ทำได้นะครับเช่น
SELECT *
FROM OPENROWSET ('SQLNCLI', 'Server=TestServer;Trusted_Connection=yes;',
'EXEC [TestDB].[dbo].[spReportTestReceipt] @YEARMONTH=N''201001''')
WHERE RECEIPTDATE > '2010-01-15' AND RECEIPTDATE <'2010-01-20'
AND ClientNo = 'X12345'
ORDER BY ReceiptDate
แสดงความคิดเห็น