• SQL exec的用法


    一、使用EXEC执行存储过程

    1.執行帶返回參數/輸入參數的存儲過程

    declare @count decimal(18,2)
    exec Pro_Get_TotalNum 'CP-151207-27 ','2-1-1','-',@count output
    print @count

    2.執行存儲過程

    exec Pro_Get_TotalNum

    3.執行帶輸入參數的存儲過程

    exec Pro_Get_TotalNum @DocNo = 'P-151207-27' 

    或  exec Pro_Get_TotalNum  'P-151207-27'

    或  exec Pro_Get_TotalNum  'P-151207-27','001'

     

    二、使用EXEC执行动态的SQL语句

    注意:动态的sql必须包含于圆括号内如:

    1. exec ('select * from mytable')  

    使用EXEC执行动态sql语句注意下面问题

    1.不能有输入参数,输出参数

    下面的脚本是错误的:

    1. DECLARE @i AS INT;  
    2. SET @i = 10248;  
    3.   
    4. DECLARE @sql AS VARCHAR(52);  
    5. SET @sql = 'SELECT * FROM dbo.Orders WHERE OrderID = @i;';  
    6. EXEC(@sql);  
    7. GO  

    2.园括号内部能使用函数或case表达式

    下面的脚本是错误的:

    1. DECLARE @schemaname AS NVARCHAR(128), @tablename AS NVARCHAR(128);  
    2. SET @schemaname = N'dbo';  
    3. SET @tablename = N'Order Details';  
    4. EXEC(N'SELECT COUNT(*) FROM '  
    5.      + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';');  
    6. GO  

    不过把函数放在变量中是可以的:

    1. DECLARE  
    2.   @schemaname AS NVARCHAR(128),  
    3.   @tablename AS NVARCHAR(128),  
    4.   @sql AS NVARCHAR(539);  
    5. SET @schemaname = N'dbo';  
    6. SET @tablename = N'Order Details';  
    7. SET @sql = N'SELECT COUNT(*) FROM '  
    8.   + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';'  
    9. EXEC(@sql);  

    3.不能利用重用执行计划,存所以存在性能问题

    1. DECLARE @i AS INT;  
    2. SET @i = 10248;  
    3.   
    4. DECLARE @sql AS VARCHAR(52);  
    5. SET @sql = 'SELECT * FROM dbo.Orders WHERE OrderID = '  
    6.   + CAST(@i AS VARCHAR(10)) + N';';  
    7. EXEC(@sql);  
    8. GO  

    当@i = 10248, 10249, 10250要生成3个执行计划。

    4。容易被sql注入,存在安全问题。

    1. DECLARE @lastname AS NVARCHAR(40), @sql AS NVARCHAR(200);  
    2. SET @lastname = N''' DROP TABLE dbo.Employees --';  
    3. SET @sql = N'SELECT * FROM dbo.Employees WHERE LastName = '''  
    4.   + @lastname + ''';';  
    5. EXEC @sql;  
    6. GO  

    实际执行的sql为:

    1. SELECT * FROM dbo.Employees WHERE LastName = '' DROP TABLE dbo.Employees --';  
    多一分冷靜,少一分浮躁
  • 相关阅读:
    vsftpd的详细配置讲解
    ActiveMQ安装与配置
    Apache安装完之后再安装其他模块
    搭建 LAMP apache2.4 + php5.5 + mysql5.5/6 配置文件没有作用的问题
    LAMP apache2.4 + php5.5 + mysql5.5/6
    进制之间的转换
    Mac 常用属性
    关于颜色值透明度的设置
    关于TextView 的属性
    Android 关于软键盘
  • 原文地址:https://www.cnblogs.com/AnnyGird-LiMing/p/5029541.html
Copyright © 2020-2023  润新知