通过非动态SQL语句在SQL Server中执行动态查询

Xhx_09

Xhx_09

2016-02-19 18:17

下面是个超简单的通过非动态SQL语句在SQL Server中执行动态查询教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

  问题:

  我尝试在一个存储过程中传递一系列以逗号划定界限的值,以限制结果集。但是无论什么时候,我在IN子句中使用变量,都会得到错误信息。是否存在一种不执行动态SQL语句也能完成查询的方式呢?

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  专家解答:

  这里存在一种不执行动态SQL语句也能完成查询的方式,但是首先让我们来探究这个问题。我将在以下例子中运用AdventureWorks数据库。

  在你只有一个值的时候,执行将不会有什么问题。

  Declare@ManagerIDsVarchar(100)
  Set@ManagerIDs='3'
  Select*fromHumanResources.Employee
  WhereManagerIDIN(@ManagerIDs)

  但是一旦你增加逗号,结果就会大致如下:

  Declare@ManagerIDsVarchar(100)
  Set@ManagerIDs='3,6'
  Select*fromHumanResources.Employee
  WhereManagerIDIN(@ManagerIDs)
  Msg245,Level16,State1,Line4
  Conversionfailedwhenconvertingthevarcharvalue'3,6'todatatypeint.

  这是因为SQL Sever分辨出ManagerID列是一个整数,因此会自动把@ManagerIDs转换成变量。

  为了解决这个问题,你可以运用动态SQL执行这个语句。这样,你就能在执行它之前动态地建立整个查询。

  Declare@ManagerIDsVarchar(100)
  Set@ManagerIDs='3,6'
  Declare@SQLVarchar(1000)
  Set@SQL=
  'Select*fromHumanResources.Employee
  WhereManagerIDIN('+@ManagerIDs+')'
  EXEC(@SQL)

  这样能让你执行这个查询,但是动态SQL是个危险分子,在一些特定的组织中甚至不被允许使用。

  那么你要如何在不使用动态SQL的情况下执行查询呢?可以通过XML实现。

  第一步,你需要从一个以逗划定界限的字符串中产生一个XML字段。

  Declare@ManagerIDsVarchar(100)
  Set@ManagerIDs='3,6'
  DECLARE@XmlStrXML
  SET@XmlStr=
  --StartTag
  ''+
  --Replaceallcommaswithanendingtagandstartanewtag
  REPLACE(@ManagerIDs,',','')+
  --EndTag
  ''

  接着,选择这个XML值,结果显示如下:

  Select @XmlStr

  既然你有一个XML字段,我们就可以查询它,结果按行显示如下:

  SELECTx.ManagerID.value('.','INT')ASA
  FROM@XmlStr.nodes('//ManagerID')x(ManagerID)

  现在,你可以利用之前的查询来限制结果:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  SELECT*
  FROMHumanResources.Employee
  WHEREManagerIDIN(
  SELECTx.ManagerID.value('.','INT')ASA
  FROM@XmlStr.nodes('//ManagerID')x(ManagerID)
  )

  或者,你可以利用Inner Join来限制结果:

  SELECT*
  FROMHumanResources.EmployeeASA
  INNERJOIN
  (SELECTx.ManagerID.value('.','INT')ASManagerID
  FROM@XmlStr.nodes('//ManagerID')x(ManagerID))B
  ONA.ManagerID=B.ManagerID

展开更多 50%)
分享

猜你喜欢

通过非动态SQL语句在SQL Server中执行动态查询

编程语言 网络编程
通过非动态SQL语句在SQL Server中执行动态查询

动态SQL语句

SQLServer
动态SQL语句

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在SQL Server中通过原子建立分子查询

SQLServer
在SQL Server中通过原子建立分子查询

SQL SERVER 查询正在实行的SQL语句

编程语言 网络编程
SQL SERVER 查询正在实行的SQL语句

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC在SQL Server7中动态增加/删除用户

编程语言 网络编程
VC在SQL Server7中动态增加/删除用户

在ASP中判断SQL语句是否执行成功

ASP
在ASP中判断SQL语句是否执行成功

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

一个简单的用存储过程分页

一个简单的用存储过程分页

SQL Server VS Oracle:并行处理方法对比

SQL Server VS Oracle:并行处理方法对比
下拉加载更多内容 ↓