把动态SQL结果集转化为视图查询的方法(运行环境:SQL2005以上版本)
2010-06-10 01:55
525 查看
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-06-10 01:49:18
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Subject:把动态SQL结果集转化为视图查询的方法(运行环境:SQL2005以上版本)
-- Blog : http://blog.csdn.net/htl258 ----------------------------------------------------------------------------------
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([Range] [int],[Level] [int],[Persons] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','1','a' UNION ALL
SELECT '2','1','b' UNION ALL
SELECT '1','2','c' UNION ALL
SELECT '2','3','d' UNION ALL
SELECT '1','4','e' UNION ALL
SELECT '3','5','f'
--SELECT * FROM [tb]
-->SQL查询如下:
IF OBJECT_ID('p_test') IS NOT NULL
DROP PROC p_test
GO
CREATE PROC p_test
AS
SET NOCOUNT ON
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME([Level]),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME([Level])+','''') Level'+LTRIM([Level])
FROM tb
GROUP BY [Level]
EXEC('
SELECT [Range],'+@s1+'
FROM tb
PIVOT(MAX(Persons) FOR [Level] IN('+@s+'))b
')
SET NOCOUNT OFF
GO
--创建视图:
IF OBJECT_ID('v_test') IS NOT NULL
DROP VIEW v_test
GO
CREATE VIEW v_test
AS
SELECT *
FROM OPENROWSET(
'sqloledb',
'Trusted_Connection=yes', --此处可用'uid=sa;pwd=123' (SQL认证的方式来代替)
'SET FMTONLY OFF; --注意:要加上此选项
EXEC mydb..p_test --这里的mydb要改为实际的数据库名,p_test为创建好的存储过程名
'
)
GO
--查询:
SELECT * FROM v_test;
/*
Range Level1 Level2 Level3 Level4 Level5
----------- ---------- ---------- ---------- ---------- ----------
1 a c e
2 b d
3 f
(3 行受影响)
*/
需求贴:http://topic.csdn.net/u/20100609/16/01aa33e2-d2db-4cee-a514-1dbefb7bc0aa.html?seed=1476244871
-- Author : htl258(Tony)
-- Date : 2010-06-10 01:49:18
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Subject:把动态SQL结果集转化为视图查询的方法(运行环境:SQL2005以上版本)
-- Blog : http://blog.csdn.net/htl258 ----------------------------------------------------------------------------------
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([Range] [int],[Level] [int],[Persons] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','1','a' UNION ALL
SELECT '2','1','b' UNION ALL
SELECT '1','2','c' UNION ALL
SELECT '2','3','d' UNION ALL
SELECT '1','4','e' UNION ALL
SELECT '3','5','f'
--SELECT * FROM [tb]
-->SQL查询如下:
IF OBJECT_ID('p_test') IS NOT NULL
DROP PROC p_test
GO
CREATE PROC p_test
AS
SET NOCOUNT ON
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME([Level]),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME([Level])+','''') Level'+LTRIM([Level])
FROM tb
GROUP BY [Level]
EXEC('
SELECT [Range],'+@s1+'
FROM tb
PIVOT(MAX(Persons) FOR [Level] IN('+@s+'))b
')
SET NOCOUNT OFF
GO
--创建视图:
IF OBJECT_ID('v_test') IS NOT NULL
DROP VIEW v_test
GO
CREATE VIEW v_test
AS
SELECT *
FROM OPENROWSET(
'sqloledb',
'Trusted_Connection=yes', --此处可用'uid=sa;pwd=123' (SQL认证的方式来代替)
'SET FMTONLY OFF; --注意:要加上此选项
EXEC mydb..p_test --这里的mydb要改为实际的数据库名,p_test为创建好的存储过程名
'
)
GO
--查询:
SELECT * FROM v_test;
/*
Range Level1 Level2 Level3 Level4 Level5
----------- ---------- ---------- ---------- ---------- ----------
1 a c e
2 b d
3 f
(3 行受影响)
*/
需求贴:http://topic.csdn.net/u/20100609/16/01aa33e2-d2db-4cee-a514-1dbefb7bc0aa.html?seed=1476244871
相关文章推荐
- 把动态SQL结果集转化为视图查询的方法(运行环境:SQL2005以上版本)
- 把动态SQL结果集转化为视图查询的方法(运行环境:SQL2005以上版本)
- SQL2005以上版本查询分析器显示行号设置方法
- [转]SQL2005以上版本查询分析器显示行号设置方法
- Eclipse neon2 在多版本JDK环境下运行方法
- plsql在安装有10g数据库及以上版本的环境上运行时database项为空的问题解决
- [转]Linq to sql 实现多条件的动态查询(方法二)
- 圖文教你怎樣配置Database Mail+JOB(MS_SQL2005以上版本)
- Microsoft SQLServer 2005查询表字段的几个视图含义
- SQL分页存储过程(适用于SQL2005以上版本)
- 在SQL-server2005中如何对运行慢的查询进行分析?
- PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- [VC VS2005] VS2005生成的exe在不装vs2005的环境运行的方法
- SqlServer 2005及其以上版本能用的查询数据的行号
- Mybatis框架运行机制(增删改查,一对一,一对多,日志系统,单元测试,版本控制,缓存,动态Sql)
- 4.4、Libgdx使用方法查询运行环境相关属性
- Linq to sql 实现多条件的动态查询(方法一)
- SQL2005以上版本数据库级触发器的应用
- 圖文教你怎樣配置Database Mail+JOB(MS_SQL2005以上版本)