这两天在做一个查询的SQL,这个SQL的一个条件是通过游标实现另外两张表查询出一个多条数据,这些数据都是INT类型,然后用IN条件进行查询,并且查询这两张表需要通过外部传入参数才能查询出所需数据,于是想到了用SQL函数返回值,并且也这样做了,由于是返回多条数据,所以把查询出来的INT类型值都拼接为了字符串,这时就遇到问题了,在查询SQL中因为条件是INT值,SQL函数的CAST和CONVERST都是不能把形如‘1,2,3’的字符串转换为INT的,目前没有想到怎么把形如‘1,2,3’的值用于INT类型 IN ()的方法,所以也在网上找了好多资料,后来就找到了用SQL函数返回表结构的数据来满足INT值的条件。
具体实现的SQL如下所示:
CREATE FUNCTION [dbo].[PURCHASE_GROUP]
(
@PURCHASE_MANAGER_ID INT--传入参数
)
RETURNS @T_GROUP TABLE(GROUP_ID INT)--返回临时表结构
AS
BEGIN
--定义第一个游标用于查询值
DECLARE PURCHASE_CHARGE_GROUP_CURSOR CURSOR FOR
SELECT
REQUEST_GROUP_DESC
FROM
PURCHASE_CHARGE_GROUP
WHERE
PURCHASE_MANAGER_ID = @PURCHASE_MANAGER_ID;
DECLARE
@GROUP_ID_STR VARCHAR(8000),
@GROUP_DESC VARCHAR(200),
@GROUP_ID INT;
--赋初始值
SET @GROUP_ID_STR = '';
SET @GROUP_DESC = '';
SET @GROUP_ID = '';
--打开游标
OPEN PURCHASE_CHARGE_GROUP_CURSOR;
--第一次取值到变量
FETCH NEXT FROM PURCHASE_CHARGE_GROUP_CURSOR INTO @GROUP_DESC;
--循环第一个游标
WHILE @@FETCH_STATUS = 0
BEGIN
--定义第二个游标,因为要用到第一个游标返回的变量,所以定义在这里
DECLARE FND_GROUP_CURSOR CURSOR FOR
SELECT
GROUP_ID
FROM
FND_GROUP
WHERE
GROUP_DESC LIKE;
--打开第二个游标
OPEN FND_GROUP_CURSOR;
SET @GROUP_ID = -1;
--第一次取第二个游标的值
FETCH NEXT FROM FND_GROUP_CURSOR INTO @GROUP_ID;
--循环第二个游标
WHILE @@FETCH_STATUS = 0
BEGIN
--插入临时表值
INSERT INTO @T_GROUP(GROUP_ID) VALUES (@GROUP_ID)
--下次循环第二个游标的值
FETCH NEXT FROM FND_GROUP_CURSOR INTO @GROUP_ID;
END;
--关闭第二个游标
CLOSE FND_GROUP_CURSOR;
--销毁第二个游标
DEALLOCATE FND_GROUP_CURSOR;
--下次循环第一个游标的值
FETCH NEXT FROM PURCHASE_CHARGE_GROUP_CURSOR INTO @GROUP_DESC;
END;
--关闭第一个游标
CLOSE PURCHASE_CHARGE_GROUP_CURSOR;
--销毁第一个游标
DEALLOCATE PURCHASE_CHARGE_GROUP_CURSOR;
RETURN ;
END;
查询临时表的数据
SELECT GROUP_ID FROM [dbo].[PURCHASE_GROUP](#purchaseManagerId#)
分享到:
相关推荐
SQL Server 中判断表或临时表是否存在 在 SQL Server 中判断表或临时表是否存在是非常重要的操作,以下将详细介绍如何判断表或临时表是否存在。 判断数据表是否存在 判断数据表是否存在可以使用两种方法。 方法...
总结,MySQL临时表提供了一种灵活的方式来存储和处理临时数据,它们在处理大量数据和复杂的查询逻辑时尤其有用。临时表可以帮助优化查询性能,特别是在需要多次处理相同数据集的情况下,避免了反复执行相同的查询。...
### 一个选查询后插入到一个临时表的Oracle函数 #### 概述 在Oracle数据库环境中,函数是一种非常有用的数据库对象,它允许开发者封装复杂的逻辑并返回特定的结果。本文将详细解析一个特定的Oracle函数——`NS_...
WHERE用于设置查询条件,GROUP BY用于数据分组,HAVING用于对分组后的数据进行筛选,ORDER BY用于排序结果,JOIN则用于连接多个表。 4. **表结构与性能**:理解数据库的表结构,包括主键、外键、索引等,对于优化...
总结,避免SQL数据库中滥用临时表和排序,需要我们深入理解查询优化,合理设计数据库结构,以及巧妙地利用索引和内置功能。对于特殊需求,如汉字转拼音,可以借助自定义函数来扩展数据库的功能。在实践中,结合业务...
表函数是一种特殊的SQL函数,它可以返回一个表作为结果。使用表函数可以更高效地处理数据,特别是在需要多次迭代或处理大量数据的情况下。 #### 示例代码分析 ```sql -- 声明变量并创建表函数 DECLARE @count INT,...
- `WHILE`循环和`Sp_ExecuteSql`存储过程结合使用,展示了如何动态生成和执行SQL语句来处理临时表数据。 5. **注意事项**: - 临时表的使用可以提高性能,特别是在需要反复处理大量数据时,因为它们在内存中存储...
在SQL Server中,遍历和更新大量数据时,...同时,合理地使用临时表还可以结合其他SQL Server的高级功能,如窗口函数,进一步优化数据处理流程。在数据库设计和优化中,理解并掌握这些技术对于提升数据库性能至关重要。
在SQL Server中,临时表是一种非常实用的工具,特别是在处理大量数据或进行复杂查询时。临时表可以在会话范围内提供一个存储数据的空间,且只对当前会话可见。本篇文章将详细探讨创建临时表的两种方法以及如何正确...
这段SQL语句的作用是创建一个名为`tab1`的临时表,并从中选择`tb_user`表中的前四条记录(根据`Id`字段排序)。这里使用了`TOP 4`来限制返回的结果数量,而`ROW_NUMBER()`函数则为每一行分配了一个唯一的行号,作为...
对于更复杂的重复数据处理场景,可以考虑使用临时表或子查询来实现。这种方式通常适用于需要对数据进行多次处理的情况。 ### 总结 综上所述,虽然“重复函数”这个术语在SQL中并不存在,但我们可以通过多种方法来...
最后,使用EXEC函数来执行动态生成的SQL语句,并将查询结果作为JSON数据返回。 三、存储JSON数据到数据表中 将生成的JSON数据存储到数据表中,可以使用INSERT INTO语句来将JSON数据插入到指定的数据表中。 例如:...
内联表值函数返回一个结果集,这个结果集就像一个临时表。与标量函数不同,内联表值函数的定义不需要`BEGIN...END`块,而是直接返回一个`SELECT`语句的结果。例如,创建一个获取特定日期所有员工打卡记录的函数`F_...
- 在SQL Server数据库中创建一个与Excel数据结构相匹配的目标表。 - 如果目标表已存在,可以跳过此步骤。 #### 二、使用SQL语句进行数据导入 1. **使用`OPENROWSET`函数**: - `OPENROWSET`函数允许您直接从...
2. **表值函数**:返回一个结果集的函数,常用于数据处理或生成临时表格。 3. **内联表值函数(Inline Table-Valued Function, ITF)**:与标量值函数类似,但返回一个表,其执行效率较高。 4. **多语句表值函数...
使用该函数,我们可以构建一个动态的SQL语句,将外部数据源的数据直接插入、更新或查询到SQL Server数据库中,避免了传统方式中需要先将数据加载到临时表或者使用BULK INSERT等方法的复杂过程。 要使用...
这种方法需要创建一个临时表或者表变量来存储行号,再通过WHERE子句筛选出需要的页码范围。例如: ```sql CREATE PROCEDURE GetPagedData (@pageNumber INT, @pageSize INT) AS BEGIN DECLARE @startIndex INT...
1. **创建临时表并插入唯一记录**:使用`SELECT DISTINCT`语句创建一个临时表`#tmp`,并将`jobs`表中的唯一记录插入到`#tmp`中。 ```sql -- 创建临时表并插入唯一记录 SELECT DISTINCT * INTO #tmp FROM jobs...
函数返回一个临时表 `@temp`,其中包含分割后的结果。 ```sql CREATE FUNCTION [dbo].[StringSplit] ( @ttstring NVARCHAR(MAX), @separator CHAR ) RETURNS @temp TABLE ( Item NVARCHAR(50) ) AS ...
这段代码展示了如何创建临时表存储非重复记录,然后替换原有表,从而实现完全重复记录的清除。 #### 保留重复记录中的第一条 ```sql SELECT identity(int, 1, 1) as autoID, * INTO #Tmp FROM tableName; SELECT ...