1. 前言
情人节临近,大家是否想要为自己的爱人做点特别的事情呢?!那为什么不用SQL Server来制作一张属于你们的爱情地图呢?本文将教大家如何使用SQL Server来绘制爱情心形。
2. SQL Server中的绘图库库
SQL Server为我们提供了一种名为sp_hexadecimal的系统存储过程,它将十进制数字转换为十六进制数字。我们可以利用这个存储过程将坐标变换成十六进制,从而在SQL Server上绘制出图形。
2.1. sp_hexadecimal存储过程的定义和使用
下面是sp_hexadecimal存储过程的定义:
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar(512) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
我们可以使用它来将坐标点转化为十六进制坐标点。
2.2. 爱心型函数的实现
绘制出爱心,在数学上是可以通过一种二次方程实现的。下面是一个可在SQL Server中实现的函数,用来生成一个离散的爱心轮廓。
CREATE FUNCTION dbo.fnLoveHeart(x float, y float)
RETURNS int
AS
BEGIN
DECLARE @i float
DECLARE @j float
SET @i = (x * x) + (y * y) - 1
SET @j = (@i * @i * @i) - (x * x * y * y * y)
RETURN CASE WHEN @j > 0 THEN 1 ELSE 0 END
END
3. 绘制爱情心形
我们可以使用下面代码来调用上述函数,在SQL Server中生成一个图形。
DECLARE @heart nvarchar(3000)
SET @heart = ''
SELECT @heart = @heart +
'
ELSE 'white" '
END
+ '>
'
FROM (SELECT DISTINCT x, y FROM #heart) AS t
ORDER BY y, x
DECLARE @html nvarchar(4000)
SET @html = '
'
+ '
' + @heart + ' '
+ '
'
PRINT @html
3.1. 生成图形
下面介绍一下如何使用上面的代码在SQL Server中绘制出一个爱心。
第一步:在SQL中创建一个临时表,用来存储所有需要展示的数据。
CREATE TABLE #heart(x int, y int)
第二步:将需要展示的数据添加到这个表中。例如,我们需要绘制一个爱心,我们需要用for循环来填充这个表中所有可能出现的坐标点。
DECLARE @i int = -27
DECLARE @j int = -15
WHILE (@i <= 27)
BEGIN
WHILE (@j <= 15)
BEGIN
INSERT INTO #heart(x, y)
VALUES (@i, @j)
SET @j = @j + 1
END
SET @j = -15
SET @i = @i + 1
END
第三步:使用上文中提到的函数dbo.fnLoveHeart
,在SQL Server中生成一个爱心的轮廓数据。
第四步:使用下面的代码生成一个字符串,用来存储生成的HTML表格代码。
DECLARE @heart nvarchar(3000)
SET @heart = ''
SELECT @heart = @heart +
'
ELSE 'white" '
END
+ '>
'
FROM (SELECT DISTINCT x, y FROM #heart) AS t
ORDER BY y, x
DECLARE @html nvarchar(4000)
SET @html = '
'
+ '
' + @heart + ' '
+ '
'
PRINT @html
第五步:设置数据库选项SET ANSI_NULLS ON和SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DECLARE @i int = -27
DECLARE @j int = -15
-- 创建一个表存储心形轮廓数据
CREATE TABLE #heart(x int, y int)
-- 生成需要绘制的坐标点
WHILE (@i <= 27)
BEGIN
WHILE (@j <= 15)
BEGIN
INSERT INTO #heart(x, y)
VALUES (@i, @j)
SET @j = @j + 1
END
SET @j = -15
SET @i = @i + 1
END
-- 绘制心形
DECLARE @heart nvarchar(3000)
SET @heart = ''
SELECT @heart = @heart +
'
ELSE 'white" '
END
+ '>
'
FROM (SELECT DISTINCT x, y FROM #heart) AS t
ORDER BY y, x
-- 输出html代码
DECLARE @html nvarchar(4000)
SET @html = '
'
+ '
' + @heart + ' '
+ '
'
PRINT @html
4. 结论
本文介绍了如何使用SQL Server自带的sp_hexadecimal
存储过程,在SQL Server上绘制出一个简单的爱心图形。大家可以在情人节或纪念日将制作好的图形赠送给你的爱人,以表达自己对彼此的爱。