首页 > 数据库 >SQLSERVER:动态SQL

SQLSERVER:动态SQL

时间:2024-02-14 19:34:42浏览次数:26  
标签:-- SQLSERVER DECLARE SQL 动态 NVARCHAR Developer

--SqlServer动态Sql
--动态SQL是指在运行时构造并执行的sql语句。这种技术在sqlserver中非常有用,尤其
--是在需要编写灵活且可适应不同情况的代码时。动态sql可以用来创建通用的存储过程,
--执行复杂的查询或者在运行时根据特定条件构建SQL语句。

--优势与风险:
--动态SQL的主要优势在于其灵活性,它允许开发者编写能够适应不同输入和条件的代码。
--然而,使用动态SQL也有风险,最主要的风险是SQL注入攻击,这是由于动态构造的SQL语句
--可能会无意中插入恶意的SQL代码

--安全实践
--为了安全地使用动态SQL,应始终:
--* 使用参数化查询,避免SQL注入
--对输入进行验证。
--
最小化使用动态SQL,只在必要时使用。

--示例脚本

-- 创建Employees表
CREATE TABLE Employees (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Position VARCHAR(50),
DepartmentID INT
);

-- 插入Employees表数据
INSERT INTO Employees (FirstName, LastName, Position, DepartmentID)
VALUES ('Jane', 'Doe', 'Manager', 1),
('John', 'Smith', 'Developer', 2),
('Alice', 'Johnson', 'Developer', 2);

INSERT INTO Employees (FirstName, LastName, Position, DepartmentID)
VALUES ('Jane1', 'Doe1', 'Manager', 1),
('John1', 'Smith1', 'Developer', 2),
('Alice1', 'Johnson1', 'Developer', 2),
('Jane2', 'Doe2', 'Manager', 1),
('John2', 'Smith2', 'Developer', 2),
('Alice2', 'Johnson2', 'Developer', 2),
('Jane3', 'Doe3', 'Manager', 1),
('John3', 'Smith3', 'Developer', 2),
('Alice3', 'Johnson3', 'Developer', 2),
('Jane4', 'Doe4', 'Manager', 1),
('John4', 'Smith4', 'Developer', 2),
('Alice4', 'Johnson4', 'Developer', 2);

--示例1:基本的动态SQL执行
DECLARE @TableName NVARCHAR(128) ='Employees';
DECLARE @SQL NVARCHAR(MAX);

SET @SQL='SELECT * FROM '+ QUOTENAME(@TableName);
Exec sp_executesql @SQL;

--示例2:使用参数的动态SQL

DECLARE @EmployeeID INT =1;
DECLARE @SQL1 NVARCHAR(MAX);

SET @SQL1 =N'SELECT * FROM Employees WHERE EmployeeID =@EmpID';
EXEC sp_executesql @SQL1,N'@EmpID INT',@EmpID=@EmployeeID;

--示例3:动态排序和分页

DECLARE @SortColumn NVARCHAR(128) ='FirstName';
DECLARE @SortOrder NVARCHAR(4) ='ASC';
DECLARE @PageSize INT =10;
DECLARE @PageNumber INT =1;
DECLARE @SQL2 NVARCHAR(MAX);

SET @SQL2 = 'SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY '+ QUOTENAME(@SortColumn)+' ' +@SortOrder + ') AS RowNum,
* FROM Employees
) AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN '+ CAST((@PageNumber -1)* @PageSize +1 AS NVARCHAR)+
' AND ' + CAST(@PageNumber * @PageSize AS NVARCHAR);
EXEC sp_executesql @SQL2;

--示例4:动态创建和执行存储过程
DECLARE @ProcedureName NVARCHAR(128) ='usp_GetEmployeeDetails';
DECLARE @SQL3 NVARCHAR(MAX);

SET @SQL3 = N'CREATE PROCEDURE ' +QUOTENAME(@ProcedureName) +'
@EmployeeID INT
AS
BEGIN
SELECT * FROM Employees WHERE EmployeeID=@EmployeeID;
END';
EXEC(@SQL3);

--现在可以执行新创建的存储过程
EXEC usp_GetEmployeeDetails @EmployeeID=1;

--总结:动态SQL是SQL Server中一个强大的工具,它可以提高代码的灵活性和适应性。然而,
--使用动态sql需要谨慎,以避免潜在的安全风险,如SQL注入。通过使用参数化查询和对输入进行
--验证,可以确保使用动态SQL的安全性。以上示例提供了一些基本的动态SQL使用方法,但在实际应用中
--可能要根据特定的业务逻辑和需求进行调整。

标签:--,SQLSERVER,DECLARE,SQL,动态,NVARCHAR,Developer
From: https://www.cnblogs.com/newcapecjmc/p/18015504

相关文章

  • 【题单】一个动态更新的洛谷综合题单
    洛谷试炼场的题目确实很具有代表性,但是近几年以来,又有许多经典题目出现在OI界中,这个大题单就是作为洛谷试炼场的扩展和补充。目录新版本食用指南更新日志题单Part0试机题Part1入门阶段Part2基础算法Part3搜索Part4动态规划Part4.1-4.4动态规划Part4.5-4.12动态规......
  • 【算法】【动态规划】钢条切割
    1 题目来自算法导论的一道经典题目:2 解答动态规划原理虽然已经用动态规划方法解决了上面问题,但是大家可能还跟我一样并不知道什么时候要用到动态规划。总结一下上面的斐波拉契数列和钢条切割问题,发现两个问题都涉及到了重叠子问题,和最优子结构。①最优子结构用动态规......
  • openJudge | 统计学生信息(使用动态链表完成)C语言
    总时间限制:1000ms内存限制:65536kB描述利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址)其中,学号长度不超过20,姓名长度不超过40,性别长度为1,地址长度不超过40输入包括若干行,每一行都是一个学生的信息,如:00630018zhouyanm2010.028......
  • 第二十二天:mysql并发控制及事务日志
    一、锁机制锁类型:读锁:共享锁,也称为S锁,只读不可写(包括当前事务),多个读互不阻塞写锁:独占锁,排它锁,也称为X锁,写锁会阻塞其它事务(不包括当前事务)的读和写S锁和S锁是兼容的,X锁和其它锁都不兼容,举个例子,事务T1获取了一个行r1的S锁,另外事务T2可以立即获......
  • c语言操作sqlite
    前言c语言只需要下载sqlite.dll即可操作数据库,qtsql只是对sqlite的api做了一层驱动包装而已下载    #include<stdio.h>#include<assert.h>#include<string.h>#include"sqlite3.h"voidsqlite3_test_get_table(sqlite3*db){char**rows=NULL;intnrow......
  • MySQL笔记
    MySQL查看表结构简单命令创建数据库:CREATEDATABASETest1Spider使用数据库:usetest1spider删除表:DROPTABLE语句用于删除数据库中的现有表。--删除表,如果存在的话DROPTABLEIFEXISTSmytable;--直接删除表,不检查是否存在DROPTABLEmytable;创建表CREATETABLE......
  • 【性能测试】MySQL连接数及连接异常排查
    一、mysql连接数1、Mysql连接数,是服务器和数据库建立连接时,使用的连接数量。利用Mysql的SQL语句监控Mysql的连接数:showvariableslike'%connections%';max_connections:所有与数据库建立连接的最大数量max_user_connections:每个用户与数据库建立连接的最大数量2、......
  • 三十三、RBAC+动态菜单
    rolebaseaccesscontrol基于角色的权限控制1、Modelsfromdjango.dbimportmodelsclassUser(models.Model):name=models.CharField(max_length=32)password=models.CharField(max_length=32)classMeta:verbose_name_plural='用户表'......
  • 第二十一天:mysql--INDEX 索引
    一、INDEX索引介绍索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现优点:索引可以降低服务需要扫描的数据量,减少了IO次数索引可以帮助服务器避免排序和使用临时表索引可以帮助将随机I/O转为顺序I/O缺点:占......
  • php调用sql server过程记录
    更新微软源,需要安装微软的底层库curlhttps://packages.microsoft.com/config/rhel/7/prod.repo>/etc/yum.repos.d/mssqlrelease.repo安装依赖底层库yuminstall-ymsodbcsqlmssql-toolsunixODBC-devel根据php版本选择对应的pdo_sqlsrv扩展版本,查询地址为http://pecl.ph......