EXEC和sp_executesql

EXEC:T-SQL中最早提供的一种用于执行动态SQL的方法。EXEC接受一个字符串作为在圆括号中输入的参数,执行字符串中包含的批处理代码。EXEC命令的输入既支持普通字符,也支持Unicode字符。

使用游标对INFORMATION_SCHEMA.TABLES视图进行查询,以获取TSQLFundamentals2008数据库中表的名称。对于每个表,代码将构造和执行一个批处理代码,对当前表调用sp_spaceused存储过程以获取其磁盘空间使用信息:

USE TSQLFundamentals2008;
 
DECLARE
    @sql AS NVARCHAR(300),
    @schemaname AS sysname,
    @tablename AS sysname;
    
DECLARE CR CURSOR FAST_FORWARD FOR
SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE';
 
OPEN CR
FETCH NEXT FROM CR INTO @schemaname,@tablename;
WHILE @@FETCH_STATUS=0
BEGIN
    SET @sql=N'EXEC sp_spaceused N'''+QUOTENAME(@schemaname)+N'.'+QUOTENAME(@tablename)+N''';';
    EXEC(@sql);
    FETCH NEXT FROM CR INTO @schemaname,@tablename;
END
 
CLOSE CR
DEALLOCATE CR

 

sp_executesql: sp_executesql是继EXEC之后引入的另一种执行动态SQL的方法。该存储过程更安全和灵活,支持输入和输出番薯。与EXEC不同的是,sp_executesql只支持使用Unicode字符串作为其输入的批处理代码。

sp_executesql [ @statement = ] statement
[ 
    { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } 
     { , [ @param1 = ] 'value1' [ ,...n ] }
]

@params: 需要指定包含想要运行的批处理代码的Unicode字符串

@param1: 一个Unicode字符串,包含输入和输出参数的生命,接着为参数指定取值,各参数之间用逗号隔开

下面构造一个对Sales.Orders表进行查询的批处理代码

USE TSQLFundamentals2008;
 
DECLARE @sql AS NVARCHAR(100);
SET @sql=N'SELECT orderid, custid, empid, orderdate FROM Sales.Orders WHERE orderid=@orderid;';
 
EXEC sp_executesql @sql, @params=N'@orderid AS INT', @orderid=10248;

 

下面的代码静查询INFORMATION_SCHEMA.TABLES视图,获取数据库中表和视图的名称的列表,在使用游标来循环遍历对象名称。每次循环中,代码会构造一个动态SQL批处理,以查询当前对象的行数,并把结果保存在一个输出参数@n中。之后将输出参数@n中的值传递到局部变量@numrows(指定为输出参数)

USE TSQLFundamentals2008;
 
DECLARE @Counts Table
(
    schemaname sysname NOT NULL,
    tablename sysname NOT NULL,
    numrows INT NOT NULL,
    PRIMARY KEY(schemaname,tablename)
);
 
DECLARE
    @sql AS NVARCHAR(350),
    @schemaname AS sysname,
    @tablename AS sysname,
    @numrows AS INT;
    
DECLARE C CURSOR FAST_FORWARD FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
 
OPEN C
FETCH NEXT FROM C INTO @schemaname, @tablename
 
WHILE @@FETCH_STATUS=0
BEGIN
    SET @sql=N'SET @n=(SELECT COUNT(*) FROM '+QUOTENAME(@schemaname)+N'.'+QUOTENAME(@tablename)+')';
    EXEC sp_executesql @sql,@params=N'@n AS INT OUTPUT',@n=@numrows OUTPUT
    INSERT INTO @Counts(schemaname, tablename, numrows) VALUES(@schemaname, @tablename, @numrows);
    FETCH NEXT FROM C INTO @schemaname, @tablename
END
 
CLOSE C
DEALLOCATE C
 
SELECT * FROM @Counts

转载于:https://www.cnblogs.com/fast-michael/archive/2012/07/17/2594931.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值