SQL Server有许多隐藏功能和强大的功能。以下是一些例子:
例如:
查询一个名为 orders
的表,返回其 JSON 数组的第三项:
SELECT OPENJSON(orders) AS data
, items->>'order_id' AS order_id
, items->>'order_status' AS order_status
, items->>'order_total' AS order_total
FROM orders
WHERE 1 = 1;
Image
和 VarBinary
允许存储二进制信息。例如:
查询一个名为 images
的表,返回第一列的所有行的二进制数据,类型为 IMAGE/JPEG
,第二列的值表示长度,使用 CAST
进行类型转换:
SELECT CAST(IMAGESTREAM ->>0 AS IMAGE) AS image
, IMAGESTREAM ->>0 AS image_length
FROM images
WHERE 1 = 1;
ROW\_SIZE
可用于控制行记录的最大长度,以提高查询效率。此外, COMPRESSED_INDEX
或 IN\_ROW\_COMPRESSION
可以将存储的数据行压缩。例如:
执行一个查询并返回所有列中最长的 SQL 结果集,然后使用 UNPIVOT
将结果行分组,只选择 row_id
和 row_value
:
SELECT UNPIVOT(MAX(DISTINCT row_value) FOR row_num IN (MAX(idx), SUM(val)) FOR idx IN (row_id, row\_value)) AS data
INTO #maxresults
FROM table_name AS base_table
WITH (MAXRECURSION 1000);
SELECT * FROM #maxresults;
OPENXML
和 FOR XML
结构化查询语法来处理 XML 数据,可以方便地导入和导出 XML 文件。例如:
导出整个 dbo.users 表的对象(表、视图、存储过程等)及其元数据:
SELECT
name AS [@name],
schema\_name(schema\_id) AS SchemaName,
type_desc AS Type,
modify\_time AS ModifyTime,
modify\_by AS ModifyBy,
modify\_by\_property AS ModifyByProperty
FROM
user\_objects
WHERE
type = 'U' AND is\_ms\_shipped = 0
FOR XML PATH('').NODE();
例如:
在一个名为 orders
的表中创建一个名为 check\_vat
的视图事件触发器,检查 country
列值是否属于 24 个 VAT(Value Added Tax, 增值税)国家之一,并记录所有错误情况:
CREATE VIEW check_vat AS
SELECT
country
FROM
orders;
GO
CREATE TRIGGER check_vat_trigger
ON check_vat
AFTER INSERT, UPDATE, DELETE AS
BEGIN
IF EXISTS (SELECT * FROM Deleted)
BEGIN
RAISERROR('VAT not allowed for this country.', 16, 1);
END;
ELSE
BEGIN
NULL;
END;
END;
GO
由于触发器不能直接查看,所以需要使用 sys.sql\_modules
中的 "definition"
和 "object\_id"
属性来判断触发器是否存在。
DECRYPTION
和 DECRYPTION
语句对数据进行加密和解密。例如:
将 my\_database
数据库升级为 SQL Server 2022 中的最新版本:
ALTER DATABASE my_database
SET EDITION = 'Enterprise,Express,Advanced,Business Intelligence';
领取专属 10元无门槛券
手把手带您无忧上云