- [C#] Chia sẽ class Install, Uninstall, Start và Stop Services Winform
- [C#] Tìm kiếm tập tin file nhanh chóng trên Winform sử dụng thư viện FastSearchLibrary
- [C#] Giới thiệu thư viện Fluent FTP Awesome dùng để làm việc với FTP
- [C#] Sử dụng thư viện Mini Profiler Integrations ghi log thực hiện các câu lệnh SQL
- [DEVEXPRESS] Thiết kế Dropdown ButtonBarItem trên Form Ribbon
- [C#] Lưu trạng thái các control trên Winform vào Registry Windows
- [C#] Ứng dụng ví dụ Simple Observer Pattern tăng giảm số lượng trên winform
- [C#] Hướng dẫn lấy thời gian thực server time trên winform
- [DEVEXPRESS] Hướng dẫn bật tính năng Scroll Pixcel in Touch trên GridView
- [DEVEXPRESS] Hướng dẫn sử dụng TileBar viết ứng dụng duyệt hình ảnh Winform
- [DEVEXPRESS] Tô màu border TextEdit trên Winform
- [C#] Lấy dữ liệu từ Console Write hiển thị lên textbox Winform
- [C#] Hiển thị Progress bar trên Window Console
- [C#] Di chuyển control Runtime và lưu layout trên winform
- [SQLSERVER] Sử dụng hàm NULL IF
- [C#] Chia sẽ source code mã đi tuần bằng giao diện Winform
- [C#] Flash Window in Taskbar Winform
- Download và Giải nén tập tin File sử dụng Powershell
- [C#] Hướng dẫn cách lấy thông tin đăng nhập tài khoản và mật khẩu web browser trên windows
- [VB.NET] CRUD Thêm xóa sửa tìm kiếm Realtime FireBase
[SQL Server] Lấy câu lệnh tạo cấu trúc table trả về khi thực thi một Procedure trong SQL Server
Hôm nay mình chia sẽ với mọi người một Procedure trả về câu lệnh tạo cấu trúc của một "bảng trả về" khi thực thi một Procedure.
Generate table structure from result of "exec procedure" in sql server
Khi bạn muốn thực thi một procedure sao đó trả về một table, và trong table đó, bạn muốn update delete hoặc sumary gì đó, ... trước khi trả table lại cho client, bạn sẽ phải sử dụng cấu trúc lệnh SQL:
Xample:
Giả sử bạn có một procedure USP_Get_sinhvien trả về một table gồm 2 trường là MaSV, HoTen. Bạn muốn thực thi nó và đổ dữ liệu vào một bảng tạm:
CREATE TABLE #sv_tmp (MaSV varchar(50), HoTen NVARCHAR(50))
DECLARE @q nvarchar(4000)
SET @q = 'USP_Get_sinhvien'
INSERT INTO #tmp (MaSV , HoTen)
EXEC sp_executesql (@q)
SELECT * from #sv_tmp ;
Như trên, bạn phải tạo ra một cấu trúc table temp đúng như table bạn sẽ trả về từ câu truy vấn (hoặc là một store procedure). Điều này gây mất thời gian vì thực tế bạn sẽ cần create nhiều field hơn là chỉ 2 như ví dụ trên. Và sẽ khó khăn hơn khi bạn update cái store procedure đó thay đổi số lượng và cấu trúc table trả về, đồng nghĩa bạn cũng phải sửa lại cấu trúc table temp trên.
Solution:
CREATE FUNCTION UFN_Get_table_structure_from_Proc( @proc_name VARCHAR(100), @temp_table_name VARCHAR(20))
RETURNS NVARCHAR(MAX)
BEGIN
DECLARE @SPNAME sysname;
SET @SPNAME =@proc_name;
DECLARE @TMPTABLE sysname;
SET @TMPTABLE = N'#' + @temp_table_name;
DECLARE @DELIM NVARCHAR(4) = N', ' + NCHAR(10);
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'CREATE TABLE ' + @TMPTABLE + N' ( ';
WITH rowDefs AS (
SELECT TOP(100) PERCENT name + ' ' + system_type_name AS RowDef, column_ordinal
FROM sys.dm_exec_describe_first_result_set(N'exec ' + @SPNAME,NULL,1)
WHERE is_hidden = 0
ORDER BY column_ordinal
)
SELECT DISTINCT
@SQL = @SQL + STUFF ( ( SELECT @DELIM + RowDef
FROM rowDefs t1
FOR XML PATH ( '' ) ) , 1 , 1 , '' )
FROM rowDefs t2
SELECT @SQL = @SQL + N' );'
RETURN @SQL;
END
Với function này sẽ tạo ra một câu lệnh
CREATE TABLE #tmp_name(field1 TYPE, field2 TYPE,...)
một cách tự động và tùy vào cấu trúc trả về của procedure name truyền vào.
Usage:
DECLARE @sql_create_table nvarchar(max)
set @sql_create_table = dbo.UFN_get_table_structure_from_Proc ('USP_Get_sinhvien', 'temp_sv')
exec(@sql_create_table );
--Test
--select * from #temp_sv;
INSERT INTO #temp_sv
EXEC EXEC USP_Get_sinhvien;
SELECT * from #temp_sv;
Trên đây là cách các bạn có thể trả về một cấu trúc table khi exec một store procedure. Việc create table temp phụ thuộc vào store procedure bây giờ sẽ đơn giản hơn nhiều rồi :))
Chúc các bạn thành công !
HAPPY CODING <3<3<3