GVKun编程网logo

如何将 sp_executesql 结果转换为变量?(plsql数据类型转换)

18

此处将为大家介绍关于如何将sp_executesql结果转换为变量?的详细内容,并且为您解答有关plsql数据类型转换的相关问题,此外,我们还将为您介绍关于execsp_executesql比直接执行

此处将为大家介绍关于如何将 sp_executesql 结果转换为变量?的详细内容,并且为您解答有关plsql数据类型转换的相关问题,此外,我们还将为您介绍关于exec sp_executesql 比直接执行 SQL 慢,而且消耗大量资源问题、exec 与 exec sp_executesql 的用法及比较、EXEC的使用与sp_executesql命令的区别、mssql server EXEC和sp_executesql的有用信息。

本文目录一览:

如何将 sp_executesql 结果转换为变量?(plsql数据类型转换)

如何将 sp_executesql 结果转换为变量?(plsql数据类型转换)

我有一条需要执行的动态 SQL,然后我需要将结果存储到一个变量中。

我知道我可以使用sp_executesql,但找不到有关如何执行此操作的明确示例。

答案1

小编典典

如果你有 OUTPUT 参数,你可以做

DECLARE @retval int   DECLARE @sSQL nvarchar(500);DECLARE @ParmDefinition nvarchar(500);DECLARE @tablename nvarchar(50)  SELECT @tablename = N''products''SELECT @sSQL = N''SELECT @retvalOUT = MAX(ID) FROM '' + @tablename;  SET @ParmDefinition = N''@retvalOUT int OUTPUT'';EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@retval OUTPUT;SELECT @retval;

但是如果你不这样做,并且不能修改 SP:

-- Assuming that your SP return 1 valuecreate table #temptable (ID int null)insert into #temptable exec mysp ''Value1'', ''Value2''select * from #temptable

不漂亮,但有效。

exec sp_executesql 比直接执行 SQL 慢,而且消耗大量资源问题

exec sp_executesql 比直接执行 SQL 慢,而且消耗大量资源问题

今天 SqlServer 数据库出现了访问不通的情况,抓紧重启了下服务,让大家先恢复使用,然后我开了 SQL Server Profiler 看看是不是存在性能问题 SQL,然后就发现一批这样的 SQL,看 reads 到了 6 万、2 万的级别,这个 SQL 查询的结果也就几条,这 reads 明显存在问题

把 SQL 改写下试试,

可以看到,SQL 很快的,reads 在个位数,确认存在问题无疑。

上面自动生成的 SQL 与改写的 SQL 对比,可以看到写法最大的区别就是 exec sp_executesql ,初步怀疑是这个引起的问题。

找到代码所在行,上面的 SQL 是使用的 SqlSugar 生成的代码

List<Log_hh_god> wpList = _ILog_hh_godRep.FindListByClause(x => x.hhpc == hhpc);

怀疑是不是自动生成的 SQL 有问题,改成手写的 SQL,执行后发现还是不行

List<Log_hh_crd> kxList = _ILog_hh_crdRep.QueryList<Log_hh_crd>("SELECT * FROM [Log_hh_crd]  WHERE  hhpc=@hhpc ", new { hhpc = hhpc });

然后就是在网上找资料,最终有个回答引起了我的注意,于是我去确认了下 Log_hh_crd 表中的字段 hhpc 的类型,是 varchar ,而上面自动生成的 SQL 里面是 nvarcahr (4000),会不会是这个区别的问题呢

改了一对比,结果很明显了,就是 SQL 中的类型与实际类型不一致,导致资源消耗远远超过预期。

试了 SqlSugar 提供的字段标注功能,有个 ColumnDataType,加上试试

[SqlSugar.SugarColumn(ColumnDataType = "varchar(40)")]
  public string hhpc { get; set; }

结果不行,去翻了下文档,说 “自定义生成的数据类型,生成表会用到”,这条路走不通了。。。

 

只能使用终极办法 =======> 修改字段类型!!!

注意

1、如果这个字段存在索引的话,需要先备份索引创建 SQL,然后删除索引,再改字段格式,然后再加上索引

2、如果数据量比较大,建议在非业务高峰进行这个操作。

 

exec 与 exec sp_executesql 的用法及比较

exec 与 exec sp_executesql 的用法及比较

总结

以上是小编为你收集整理的exec 与 exec sp_executesql 的用法及比较全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

EXEC的使用与sp_executesql命令的区别

EXEC的使用与sp_executesql命令的区别

sp_executesql的使用 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(

    sp_executesql的使用

  MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql.

  EXEC的使用

  EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。

  下面先使用EXEC演示一个例子,代码1
  DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = ''Orders'';SET @OrderID = 10251;SET @sql = ''SELECT * FROM ''+QUOTENAME(@TableName) +''WHERE OrderID = ''+CAST(@OrderID AS VARCHAR(10))+'' ORDER BY ORDERID DESC''EXEC(@sql);注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC:

  EXEC(''SELECT TOP(''+ CAST(@TopCount AS VARCHAR(10)) +'')* FROM ''+QUOTENAME(@TableName) +'' ORDER BY ORDERID DESC'');

  SQL编译器就会报错,编译不通过,而如果我们这样:

  EXEC(@sql+@sql2+@sql3);编译器就会通过;所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,考试大提示这样就不会受限制了;

  EXEC不提供接口

  这里的接口是指,它不能执行一个包含一个带变量符的批处理,这里乍一听好像不明白,不要紧,我在下面有一个实例,您一看就知道什么意思.

  DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = ''Orders'';SET @OrderID = 10251;SET @sql = ''SELECT * FROM ''+QUOTENAME(@TableName) +''WHERE OrderID = @OrderID ORDER BY ORDERID DESC''EXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就会产生一下错误

  Msg 137, Level 15, State 2, Line 1

  必须声明标量变量 "@OrderID"。

  使用EXEC时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中,如:SET @sql = ''SELECT * FROM ''+QUOTENAME(@TableName) +''WHERE OrderID = ''+CAST(@OrderID AS VARCHAR(10))+'' ORDER BY ORDERID DESC''

  串联变量的内容也存在性能方面的弊端。SQL Server为每一个的查询字符串创建新的执行计划,即使查询模式相同也是这样。为演示这一点,先清空缓存中的执行计划

  DBCC FREEPROCCACHE (这个不是本文所涉及的内容,您可以查看MS的MSDN)

  

  将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。然后使用下面的代码查询

  SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE ''%cach%'' AND sql NOT LIKE ''%sys.%'' 点击F5运行,就会出现下面如图所示的查询结果:

  我们可以看到,每执行一次都要产生一次的编译,执行计划没有得到充分重用。

  EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。默认情况下,EXEC把查询的输出返回给调用者。例如下面代码返回Orders表中所有的记录数

  DECLARE @sql NVARCHAR(MAX)SET @sql = ''SELECT COUNT(ORDERID) FROM Orders'';EXEC(@sql);然而,如果你要把输出返回给调用批处理中的变量,事情就没有那么简单了。为此,你必须使用INSERT EXEC语法把输出插入到一个目标表中,然后从这表中获取值后赋给该变量,就像这样:

  DECLARE @sql NVARCHAR(MAX),@RecordCount INTSET @sql = ''SELECT COUNT(ORDERID) FROM Orders''; CREATE TABLE #T(TID INT);INSERT INTO #T EXEC(@sql);SET @RecordCount = (SELECT TID FROM #T)SELECT @RecordCountDROP TABLE #T2,sp_executesql的使用

  sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。

mssql server EXEC和sp_executesql

mssql server EXEC和sp_executesql

mssql server exec和sp_executesql

,EXEC的使用

2,sp_executesql的使用

       MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和

sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没

有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供

了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。EXEC

在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用

sp_executesql.

1,EXEC的使用

EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以

下所讲的都是第二种用法。

下面先使用EXEC演示一个例子,代码1

DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET

@TableName = ''Orders'';SET @OrderID = 10251;SET @sql = ''SELECT * FROM

''+QUOTENAME(@TableName) +''WHERE OrderID = ''+CAST(@OrderID AS VARCHAR(10))+''

ORDER BY ORDERID DESC''EXEC(@sql);注:这里的EXEC括号中只允许包含一个字符串变

量,但是可以串联多个变量,如果我们这样写EXEC:

EXEC(''SELECT TOP(''+ CAST(@TopCount AS VARCHAR(10)) +'')* FROM ''+QUOTENAME

(@TableName) +'' ORDER BY ORDERID DESC'');
SQL编译器就会报错,编译不通过,而如果我们这样:
EXEC(@sql+@sql2+@sql3);编译器就会通过;
 
所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数

,这样就不会受限制了;
 
EXEC不提供接口
 
这里的接口是指,它不能执行一个包含一个带变量符的批处理,这里乍一听好像不明白

,不要紧,我在下面有一个实例,您一看就知道什么意思.
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET

@TableName = ''Orders'';SET @OrderID = 10251;SET @sql = ''SELECT * FROM

''+QUOTENAME(@TableName) +''WHERE OrderID = @OrderID ORDER BY ORDERID

DESC''EXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就

会产生一下错误

Msg 137, Level 15, State 2, Line 1
必须声明标量变量 "@OrderID"。

使用EXEC时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中,如

:SET @sql = ''SELECT * FROM ''+QUOTENAME(@TableName) +''WHERE OrderID =

''+CAST(@OrderID AS VARCHAR(10))+'' ORDER BY ORDERID DESC''

串联变量的内容也存在性能方面的弊端。SQL Server为每一个的查询字符串创建新的执

行计划,即使查询模式相同也是这样。为演示这一点,先清空缓存中的执行计划

DBCC FREEPROCCACHE (这个不是本文所涉及的内容,您可以查看MS的MSDN)

http://msdn.microsoft.com/zh-cn/library/ms174283.x

将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。然后使用

下面的代码查询

SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql

我们今天的关于如何将 sp_executesql 结果转换为变量?plsql数据类型转换的分享已经告一段落,感谢您的关注,如果您想了解更多关于exec sp_executesql 比直接执行 SQL 慢,而且消耗大量资源问题、exec 与 exec sp_executesql 的用法及比较、EXEC的使用与sp_executesql命令的区别、mssql server EXEC和sp_executesql的相关信息,请在本站查询。

本文标签: