- [C#] Cách Sử Dụng DeviceId trong C# Để Tạo Khóa Cho Ứng Dụng
- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
[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