» SQL server » Tổng hợp các hàm SQL server tự định nghĩa có thể hữu ích cho bạn

Tổng hợp các hàm SQL server tự định nghĩa có thể hữu ích cho bạn

Đã xem: 1558 | Share: Google Bookmarks Facebook twitterShare on BanbeShare on Hot! | Thông tin hữu ích -> +1 ủng hộ hmclip
Trong quá trình lập trình nếu bạn làm việc nhiều với cơ sở dữ liệu SQL server chắc hẳn bạn sẽ gặp nhiều vấn đề cần thực hiện và tìm cách xây dựng các hàm cho riêng mình. Các hàm này sẽ rất hữu ích với vấn đề mà người khác đang cần. Vì lý do đó tôi chia sẻ lên các hàm mà tôi đã viết hoặc đã sưu tầm mà tôi đã và đang sử dụng. Có rất nhiều hàm và thủ tục mà tại thời điểm này tôi không nhớ hết do đó tôi sẽ cập nhật dần để các bạn tham khảo

1. Hàm convert chuỗi TCVN sang Unicode

CREATE Function [dbo].[fTCVNToUnicode](
	 @strInput VARCHAR(4000))
RETURNS NVARCHAR(4000)
AS  
BEGIN 
	DECLARE @strOutput NVARCHAR(4000)
	DECLARE @TCVN CHAR(671)
	DECLARE @UNICODE CHAR(671)
	SET @TCVN = ',184 ,181 ,182 ,183 ,185 ,168 ,190 ,187 ,188 ,189 ,198 ,169 ,202 ,199 ,200 ,201 ,203 ,208 ,204 ,206 ,207 ,209 ,170 ,213 ,210 ,211 ,212 ,214 ,221 ,215 ,216 ,220 ,222 ,227 ,223 ,225 ,226 ,228 ,171 ,232 ,229 ,230 ,231 ,233 ,172 ,237 ,234 ,235 ,236 ,238 ,243 ,239 ,241 ,242 ,244 ,173 ,248 ,245 ,246 ,247 ,249 ,253 ,250 ,251 ,252 ,254 ,174 ,184 ,181 ,182 ,183 ,185 ,161 ,190 ,187 ,188 ,189 ,198 ,162 ,202 ,199 ,200 ,201 ,203 ,208 ,204 ,206 ,207 ,209 ,163 ,213 ,210 ,211 ,212 ,214 ,221 ,215 ,216 ,220 ,222 ,227 ,223 ,225 ,226 ,228 ,164 ,232 ,229 ,230 ,231 ,233 ,165 ,237 ,234 ,235 ,236 ,238 ,243 ,239 ,241 ,242 ,244 ,166 ,248 ,245 ,246 ,247 ,249 ,253 ,250 ,251 ,252 ,254 ,167 ,'
	SET @UNICODE = ',225 ,224 ,7843,227 ,7841,259 ,7855,7857,7859,7861,7863,226 ,7845,7847,7849,7851,7853,233 ,232 ,7867,7869,7865,234 ,7871,7873,7875,7877,7879,237 ,236 ,7881,297 ,7883,243 ,242 ,7887,245 ,7885,244 ,7889,7891,7893,7895,7897,417 ,7899,7901,7903,7905,7907,250 ,249 ,7911,361 ,7909,432 ,7913,7915,7917,7919,7921,253 ,7923,7927,7929,7925,273 ,193 ,192 ,7842,195 ,7840,258 ,7854,7856,7858,7860,7862,194 ,7844,7846,7848,7850,7852,201 ,200 ,7866,7868,7864,202 ,7870,7872,7874,7876,7878,205 ,204 ,7880,296 ,7882,211 ,210 ,7886,213 ,7884,212 ,7888,7890,7892,7894,7896,416 ,7898,7900,7902,7904,7906,218 ,217 ,7910,360 ,7908,431 ,7912,7914,7916,7918,7920,221 ,7922,7926,7928,7924,272 ,'
	DECLARE @COUNTER INT
	DECLARE @POSITION INT
	SET @COUNTER = 1
	SET @strOutput = ''
	WHILE (@COUNTER <= LEN(@strInput))
	BEGIN 
		SET @POSITION = CHARINDEX(','+CONVERT(CHAR(4),ASCII(SUBSTRING(@strInput, @COUNTER, 1)))+',', @TCVN, 1)
		IF @POSITION > 0
		begin       
			  SET @strOutput = @strOutput + NCHAR(CONVERT(INT,SUBSTRING(@UNICODE, @POSITION+1, 4)))
		end
		ELSE
			  SET @strOutput = @strOutput + SUBSTRING(@strInput, @COUNTER, 1)
	SET @COUNTER = @COUNTER + 1
	END
	return @strOutput
END

2. Hàm convert chuỗi Unicode sang TCVN

CREATE FUNCTION Unicode2TCVN (@strInput NVARCHAR(4000))
RETURNS VARCHAR(4000)
AS
Begin
	DECLARE @strOutput NVARCHAR(4000), @COUNTER INT, @POSITION INT
	SET @COUNTER = 1 SET @strOutput = ''
	DECLARE @TCVN CHAR(671), @UNICODE CHAR(671)
	SET @TCVN = ',184 ,181 ,182 ,183 ,185 ,168 ,190 ,187 ,188 ,189 ,198 ,169 ,202 ,199 ,200 ,201 ,203 ,208 ,204 ,206 ,207 ,209 ,170 ,213 ,210 ,211 ,212 ,214 ,221 ,215 ,216 ,220 ,222 ,227 ,223 ,225 ,226 ,228 ,171 ,232 ,229 ,230 ,231 ,233 ,172 ,237 ,234 ,235 ,236 ,238 ,243 ,239 ,241 ,242 ,244 ,173 ,248 ,245 ,246 ,247 ,249 ,253 ,250 ,251 ,252 ,254 ,174 ,184 ,181 ,182 ,183 ,185 ,161 ,190 ,187 ,188 ,189 ,198 ,162 ,202 ,199 ,200 ,201 ,203 ,208 ,204 ,206 ,207 ,209 ,163 ,213 ,210 ,211 ,212 ,214 ,221 ,215 ,216 ,220 ,222 ,227 ,223 ,225 ,226 ,228 ,164 ,232 ,229 ,230 ,231 ,233 ,165 ,237 ,234 ,235 ,236 ,238 ,243 ,239 ,241 ,242 ,244 ,166 ,248 ,245 ,246 ,247 ,249 ,253 ,250 ,251 ,252 ,254 ,167 ,'
	SET @UNICODE = ',225 ,224 ,7843,227 ,7841,259 ,7855,7857,7859,7861,7863,226 ,7845,7847,7849,7851,7853,233 ,232 ,7867,7869,7865,234 ,7871,7873,7875,7877,7879,237 ,236 ,7881,297 ,7883,243 ,242 ,7887,245 ,7885,244 ,7889,7891,7893,7895,7897,417 ,7899,7901,7903,7905,7907,250 ,249 ,7911,361 ,7909,432 ,7913,7915,7917,7919,7921,253 ,7923,7927,7929,7925,273 ,193 ,192 ,7842,195 ,7840,258 ,7854,7856,7858,7860,7862,194 ,7844,7846,7848,7850,7852,201 ,200 ,7866,7868,7864,202 ,7870,7872,7874,7876,7878,205 ,204 ,7880,296 ,7882,211 ,210 ,7886,213 ,7884,212 ,7888,7890,7892,7894,7896,416 ,7898,7900,7902,7904,7906,218 ,217 ,7910,360 ,7908,431 ,7912,7914,7916,7918,7920,221 ,7922,7926,7928,7924,272 ,'
 	WHILE (@COUNTER <= LEN(@strInput))
		BEGIN
			SET @POSITION = CHARINDEX(','+CONVERT(CHAR(4),UNICODE(SUBSTRING(@strInput, @COUNTER, 1)))+',', @UNICODE, 1)
			IF @POSITION > 0
				Begin 
					SET @strOutput = @strOutput + CHAR(CONVERT(INT,SUBSTRING(@TCVN, @POSITION+1, 4)))
				End 
			Else 
			SET @strOutput = @strOutput + SUBSTRING(@strInput, @COUNTER, 1)
			SET @COUNTER = @COUNTER + 1
		END
	RETURN @strOutput
END
Hai hàm này sẽ là quá tuyệt với với vấn đề là khi dữ liệu bạn nhận được là TCNV giờ muốn convert sang Unicode hoặc ngược lại

3. Hàm tạo chuỗi ký tự ngẫu nhiên.

Tại hmweb ngày trước tôi cũng đã giới thiệu về thủ tục tạo chuỗi ký tự ngẫu nhiên nhưng là thủ tục thì áp dụng nó hơi khó do đó ở bài viết này tôi viết thành hàm để dễ xử dụng. Vì ở đây ta có dùng hàm Rand() trong hàm mà khi viết hàm không được sử dụng hàm này do đó trước tiên  ta cần tạo một View để lấy ra số Rand này:

CREATE VIEW vw_Random
AS
SELECT rand() as Random
Sử dụng view này trong hàm như sau
CREATE FUNCTION GeneratePassword(@Length int)
RETURNS varchar(32)
AS
BEGIN
	DECLARE @RandomID varchar(32)
	DECLARE @counter smallint
	DECLARE @RandomNumber float
	DECLARE @RandomNumberInt tinyint
	DECLARE @CurrentCharacter varchar(1)
	DECLARE @ValidCharacters varchar(255)
	SET @ValidCharacters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
	DECLARE @ValidCharactersLength int
	SET @ValidCharactersLength = len(@ValidCharacters)
	SET @CurrentCharacter = ''
	SET @RandomNumber = 0
	SET @RandomNumberInt = 0
	SET @RandomID = ''
	SET @counter = 1
	WHILE @counter < (@Length + 1)
	BEGIN
		SET @RandomNumber = (SELECT random from vw_random)
		SET @RandomNumberInt = Convert(tinyint, 
			((@ValidCharactersLength - 1) * @RandomNumber + 1))
		SELECT @CurrentCharacter = 
			SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)
		SET @counter = @counter + 1
		SET @RandomID = @RandomID + @CurrentCharacter
	END
	RETURN @RandomID
END

Giờ bạn muốn chuỗi ngẫu nhiên của bạn có bao nhiêu ký tự bạn chỉ việc truyền tham số vào. Ví dụ SELECT dbo.GeneratePassword(13) => OyTU2FhiKBTgn Với mỗi lần Chạy lệnh này sẽ cho bạn chuỗi 13 ký tự khác nhau. Ứng dụng hàm này bạn có thể tạo chuỗi mật khẩu ngẫu nhiên dùng cho chức năng quên pass của thành viên

4. Hàm trả về danh sách tất cả các ngày trong tuần

Khi cần tạo báo cáo theo tuần bạn muốn list theo danh sách các ngày của một tuần nào đó bạn có thể tham khảo hàm sau:
CREATE FUNCTION getAllDayOfWeek
(
	@Date dateTime
)
RETURNS @_Nam TABLE (mdate DateTime)
BEGIN

	Declare @intdate int SET @intdate = 0
	SELECT @intdate = (DATEPART(dw, @Date-2) + @@DATEFIRST) % 7
	INSERT INTO @_Nam
		SELECT @Date- @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date - @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date - @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date - @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date - @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date- @intdate
	SET @intdate = @intdate - 1
	INSERT INTO @_Nam
	SELECT @Date- @intdate
	SET @intdate = @intdate - 1
	RETURN	
END
Ví du: SELECT * FROM dbo.getDayOfWeek(getdate()) Sẽ cho ta tất cả các ngày của tuần hiện tại

5. Hàm Split trong SQL

Trong SQL không có hàm Split nhưng ta cũn có thể xây dựng hàm này để áp dụng, Kết quả trả về của hàm này là một bảng
CREATE FUNCTION [dbo].[fnSplit](
	@strInput NVARCHAR(4000),
	@char char(1)) 
RETURNS @Tbl TABLE (id int IDENTITY(1,1),part NVARCHAR(1000))
AS
BEGIN
	DECLARE @SubStr NVARCHAR(100), @i INT

	SET @i = CHARINDEX(@char, @strInput, 0)
	WHILE @i > 0
	BEGIN
		SET @SubStr = LEFT(@strInput,@i-1)
		INSERT INTO @Tbl
		SELECT @SubStr
		SET @strInput = SUBSTRING(@strInput, @i+1,4000)
		SET @i = CHARINDEX(@char, @strInput, 0)
	END	
	INSERT INTO @Tbl
	SELECT LTRIM(RTRIM(@strInput))
	RETURN
END

6. Hàm chuyển từ Text Sang Datetime

Thông thường khi lập trình trên Form nhập  liệu bạn để cho người dùng nhập kiểu dd/MM/yyyy nhưng trường dữ liệu trong  Database lại là dạng Datetime. Khi đó bạn áp dụng hàm này

CREATE FUNCTION fChuyenTextSangDateTime
(@mNgay	nvarchar(10))  
RETURNS datetime
AS  
BEGIN 
	DECLARE @mDate   datetime
	if (len(@mNgay)>=8)--đủ ngày tháng năm
		Set @mDate=  cast( substring( @mNgay,CHARINDEX('/',@mNgay,0)+1,CHARINDEX('/',@mNgay, CHARINDEX('/',@mNgay,0)+1)-CHARINDEX('/',@mNgay,0)-1 )+'/'+
				substring( @mNgay,0,CHARINDEX('/',@mNgay,0))+'/'+
				substring(@mNgay, CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1)+1 , len(@mNgay)-CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1))
				as datetime)
	else
		if (len(@mNgay)>4 AND len(@mNgay)<8)--có tháng năm
			Set @mDate=  cast(substring( @mNgay,0,CHARINDEX('/',@mNgay,0)) +'/01/'+
				substring(@mNgay, CHARINDEX('/',@mNgay,0)+1, len(@mNgay)-CHARINDEX('/',@mNgay,0))
			           as datetime)
		else-- có năm
			Set @mDate= cast( '01/01/'+ @mNgay  as datetime)
	return @mDate
END

7. Hàm lấy số ngày của thàng bất kỳ:

Khi bạn cần tính toán số liệu báo cáo như tính trung bình thu nhập của tháng  bất kỳ bạn sẽ cần đến hàm này nếu bạn lập trình trong SQL

CREATE FUNCTION fSoNgayCuaThang (
	@mMonth	Int,
	@mYear 	Int
)  
RETURNS int
AS  
BEGIN 	
	DECLARE @mDays	Int
	IF @mMonth = 2 
		BEGIN
			IF ((@mYear % 4 = 0 AND @mYear % 100 <> 0) OR (@mYear % 400 = 0))
				SET @mDays = 29
			ELSE
				SET @mDays = 28
		END
	ELSE
		SELECT @mDays =  
			CASE @mMonth
				WHEN 1 THEN 31
				WHEN 3 THEN 31
				WHEN 5 THEN 31
				WHEN 7 THEN 31
				WHEN 8 THEN 31
				WHEN 10 THEN 31
				WHEN 12 THEN 31
				WHEN 4 THEN 30
				WHEN 6 THEN 30
				WHEN 9 THEN 30
				WHEN 11 THEN 30
			END
	RETURN @mDays
END

8. Hàm mã hóa ký tự

CREATE    FUNCTION fuMaHoaString 
    (@strInput nvarchar(200), 
     @dt       smallint=-1)   
RETURNS nvarchar(200)  
AS   
BEGIN  
    Declare @str        nvarchar(200) 
    Declare @lenStr        tinyint 
    Declare @i        tinyint 
    Declare @k        smallint 
    Set @lenStr = Len(@strInput) 
    Set @str = '' 
    Set @i = 1 
    If (@dt = 0) 
        Set @dt = -1 
    Set @k = @dt / Abs(@dt)   
    While (@i <= @lenStr) 
    Begin 
        Set @str = @str + Char((Ascii(SubString(@strInput, @i, 1))+@k*20)) 
        Set @k = -@k 
        Set @i = @i + 1  
    End     
    Return @str 
END 
Ví dụ: SELECT dbo.fuMaHoaString('abc123',1) Sẽ trả về 'uNwF'

9. Hàm giải mã hàm đã mã hóa ở trên

Khi bạn cần tính toán số liệu báo cáo như tính trung bình thu nhập của tháng bất kỳ bạn sẽ cần đến hàm này nếu bạn lập trình trong SQL

CREATE    FUNCTION fuGiaiMaKyTuDaMaHoa
    (@strInput nvarchar(200), 
     @dt       smallint=-1)   
RETURNS nvarchar(200)  
AS   
BEGIN  
    Declare @str        nvarchar(200) 
    Declare @lenStr        tinyint 
    Declare @i        tinyint 
    Declare @k        smallint 
    Set @lenStr = Len(@strInput) 
    Set @str = '' 
    Set @i = 1 
    If (@dt = 0) 
        Set @dt = -1 
    Set @k = -@dt / Abs(@dt)   
    While (@i <= @lenStr) 
    Begin 
        Set @str = @str + Char((Ascii(SubString(@strInput, @i, 1))+@k*20)) 
        Set @k = -@k 
        Set @i = @i + 1  
    End     
    Return @str 
END
Ví dụ: SELECT dbo.fuGiaiMaKyTuDaMaHoa(dbo.fuMaHoaString('abc123',1),1) Sẽ trả về abc123

Còn tiếp ...

HMCLIP ADMIN | Share
Gửi thảo luận của bạn về bài viết
Tên của bạn:
Ý kiến của bạn:
Các ý kiến đã phản hồi (3)

Các bài viết mới hơn


Asp.net & Jquery BBcode Editor tạo Comment với BBCode đơn giản

Việc sử dụng BBcode Editor chắc bạn đã quá quen thuộc vì nó được sử dụng ở đa số các diễn đàn. Trong bài viết này tôi hướng dẫn bạn xây dựng một BBCode đơn giản cho website của bạn với Asp.net & Jquery. Bạn có thể thấy demo chính là phần comment bên dưới của bài viết

Hướng dẫn xây dựng Active Menu với Asp.net - SQL Server

Menu dạng Active Menu rất phổ biến trên các website hiện nay, Nó vừa giúp ta tiết kiệm không gian cho trang web vừa tạo được tính trực quan cao, nhìn vào đó nó chỉ dẫn cho người đọc biết họ đang ở chuyên mục nào của website. Đây cũng là vấn đề khá nhiều bạn quan tâm nên trong bài viết này tôi hướng dẫn bạn xây dựng một Active Menu với Asp.net - SQL Server.

Xây dựng chức năng tìm kiếm cho website

Chức năng tìm kiếm gần như là bắt buộc đối với mỗi website. Có nhiều cách để xây dựng chức năng tìm kiếm, trong bài viết này tôi chia sẻ với các bạn một cách xây dựng chức năng tìm kiếm cho trang web với việc viết Store truy vấn dữ liệu theo điều kiện tìm kiếm.

Các bài viết cũ hơn


SQL server Trigger cập nhật dữ liệu hàng loạt

Khi sử dụng kỹ thuật trigger để cập nhật dữ liệu tự động thường bạn dùng để xử lý khi cập nhật một bản ghi. Vấn để khi cập nhật dữ liệu theo bó (Cập nhật dữ liệu hàng loạt) thì bạn cần có kỹ thuật cao hơn một chút. Trong bài viết này tôi sẽ minh họa cho bạn cách làm khi dùng Trigger để cập nhật dữ liệu hàng loạt

ASP.NET Flash Tag Cloud Tạo mây khóa cho website

Tạo danh sách các Tags giúp tăng index với các công cụ tìm kiếm đang được rất nhiều website sử dụng. Trong bài viết này tôi hướng dẫn bạn tạo danh sách từ khóa dạng Flash cho website với ASP.NET Flash Tag Cloud Control

Hướng dẫn xây dựng trang đăng nhập trong asp.net

Form đăng nhập luôn cần thiết đối với mỗi website hay ứng dụng. Đây cũng là vấn đề mà nhiều bạn còn gặp khó khắn và hỏi trên các diễn đàn. Trong bài viết này mình sẽ hướng dẫn các bạn làm trang đăng nhập cho website hoặc ứng dụng web với ASP.NET - Csharp

Export DataTable to Excel - Xuất dữ liệu ra Excel với Asp.net

Vấn đề Xuất dữ liệu từ DataTable ra Excel tuy không khó nhưng có khá nhiều bạn cần mà chưa thực hiện được hoặc chưa được tối ưu. Bài viết này tôi hướng dẫn bạn cách đơn để xuất dữ liệu từ DataTable ra Excel trong asp.net sử dụng Csharp

Tổng hợp các thủ thuật lập trình với ASP.net - Csharp

Khi lập trình, một thủ thuật có thể đơn giản nhưng nếu không biết ta cũng sẽ giải quyết được vấn đề nhưng có thể sẽ mất nhiều công sức, Giống như một công thức toán học vậy, nếu bạn không biết bạn sẽ đi tìm cách để chứng minh một công thức có sẵn, nhưng công thức đó đã có sẵn ta chỉ việc áp dụng thôi. Khi lập trình cũng vậy nếu biết một thủ thuật nó sẽ giảm bớt công sức cho bạn

Asp.net - Sử dụng lồng các control trong trang asp.net

Khi xây dựng ứng dụng hay website, nhiều khi bạn phải sử dùng lồng các control để hiển thị dữ liệu. Việc dùng lồng control với gridview thì hmweb cũng đã có khá nhiều bài viết có sử dụng điều này. Ở bài này tôi hướng dẫn bạn dùng DataList lồng trong ListView

Cách truyền các tham số trong Store Procedure

Khi viết Store Procedure của bạn có khi bạn cần truyền tham số vào để thực hiện với yêu cầu truy vân thực tế nào đó. Và các tham số này được truyền động, để tránh việc viết nhiều Store với những yêu cầu tương tự nhau - Bài viết này giới thiệu bạn cách truyền tham số động trong Store

SQL server Convert chuỗi NCR Decimal sang Unicode

Có khi Bạn nhận được dữ liệu SQL với định dang NCR Decimal, Nếu là lập trình web thì dữ liệu này hiển thị trên trình duyệt không có vấn đề gì nhưng sẽ không tốt cho Seo chút nào. Bài viết này tôi thực hiện việc Convert chuỗi NCR Decimal sang Unicode

Kỹ thuật phân trang dữ liệu SQL server trong trang Asp.net

Phân trang dữ liệu là đề tài được nói đến khá nhiều, Nếu dữ liệu của bạn ít bạn có thể dùng Tools có sẵn của Visual Studio, Nhưng có điều với các công cụ có sẵn này khi bạn dùng thì lệnh truy vấn dữ liệu bạn luôn phải truy vấn toàn bộ và Bind vào một control, như vậy nếu dữ liệu của bạn nhiều thì đây không phải là giải pháp tốt.

Asp.net Captcha Tạo mã bảo vệ Captcha với ASP.NET

Các trang web hiện nay sử dụng captcha rất phổ biến để tránh Spam. Captch thường có dạng một hình ảnh hoặc đoạn flash chứa những kí tự ngẫu nhiên được làm biến dạng nhằm gây khó khăn cho các chương trình có khả năng nhận diện kí tự. Trong bài viết này tôi sẽ hướng dẫn tạo chức năng captcha bằng ASP.Net với ngôn ngữ là C#