VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1174|回复: 5

求一个通用的查询存储过程

[复制链接]

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-12-10 15:00:01 | 显示全部楼层 |阅读模式
想写一个通用的查询存储过程

1,表名不确定
2,字段名不确定
3,字段类型不确定
4,字段个数不确定

至少要实现前3个条件
SQL大概描述一下:

SelectID = 1
SelectName = "ClassID" 或者 SelectName = "name" 或者 SelectName = "ClassID,name"
SelectTable = "Table"

Select '+SelectName+' From '+SelectTable+' Where ID='+SelectID +'
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-12-10 15:15:01 | 显示全部楼层
增加一个需求
5,查询条件不确定

SelectName = "ClassID" 或者 SelectName = "name" 或者 SelectName = "ClassID,name"
SelectTable = "Table"
SelectStr = "ID=1"
Select '+SelectName+' From '+SelectTable+' Where '+SelectStr+'
回复

使用道具 举报

0

主题

88

帖子

55.00

积分

新手上路

Rank: 1

积分
55.00
发表于 2020-12-10 15:45:01 | 显示全部楼层
还应该加一个
6.显示的列也不确定
回复

使用道具 举报

1

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-12-10 16:00:01 | 显示全部楼层
create proc xx
@f1 varchar(50),
@f2 varchar(50),
@f3 varchar(50),
@tb varchar(50)
as
exec('select '+@f1+','+@f2+','+@f3+' from '+@tb)
回复

使用道具 举报

0

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-12-10 16:15:01 | 显示全部楼层
/*
功能描述: 通用分页显示查询
    条件:表中不存在标示递增字段
输入参数:
    @tblName:  表名  
    @strGetFields: 需要返回的列 '*':返回所以列信息
    @fldName:  排序的字段名
    @OrderType:  设置排序类型, 非 0 值则降序
    @PageSize:  页尺寸
    @PageIndex:  页码
    @doCount:  返回记录总数, 非 0 值则返回
    @strOrderBy: 缺省排序字段信息 (注意: 不要加 ORDER BY)
        格式: Field1 DESC,Field2 ASC,
    @strWhere:  查询条件 (注意: 不要加 WHERE)
输出参数: @RecordCount: 记录总数
作    者: ningfeiyang
创建时间: 2015-01-19
更改纪录:
*/
ALTER PROCEDURE Pagination2
(
  @tblName   varchar(255),
  @strGetFields varchar(1000) = '*',
  @fldName varchar(255) = '',
  @PageSize   int = 10,
  @PageIndex  int = 1,
  @doCount  bit = 0,
  @OrderType bit = 0,
  @strOrderBy varchar(500) = '',
  @strWhere  varchar(1500) = '',
  @RecordCount int output
)
AS
DECLARE @strSQL   varchar(5000)       -- 主语句
DECLARE @strTmp   varchar(200)        -- 临时变量
DECLARE @strOrder varchar(400)        -- 排序变量

--如果@doCount传递过来的不是0,就执行总数统计
IF (@doCount != 0)
BEGIN
  DECLARE @sWhere varchar(2000)
  
  SET @sWhere = ''
  IF (@strWhere != '')
   SET @sWhere = ' WHERE ' + @strWhere
   
  SET @strSQL = 'if exists (select * from dbo.sysobjects where id = object_id(''[dbo].[tmpTable]'') and OBJECTPROPERTY(id, ''IsUserTable'') = 1) '
  SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [' + @tblName + '] ' + @sWhere + ') '
  SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [' + @tblName + '] ' + @sWhere
   
  EXEC (@strSQL)
  
  SELECT @RecordCount=Total FROM tmpTable
  
  --删除总数统计临时表
  EXEC ('DROP TABLE tmpTable')
END

--PRINT @RecordCount

--如果@OrderType不是0,就执行降序
IF (@OrderType != 0)
BEGIN
  SET @strTmp = ' < (SELECT MIN'
  SET @strOrder = ' ORDER BY ' + @strOrderBy + '[' + @fldName + '] DESC'
END
ELSE
BEGIN
  SET @strTmp = ' > (SELECT MAX'
  SET @strOrder = ' ORDER BY ' + @strOrderBy + '[' + @fldName + '] ASC'
END

--如果是第一页就执行以上代码,这样会加快执行速度
IF @PageIndex = 1
BEGIN
  IF @strWhere != ''   
   SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + '  FROM [' + @tblName + '] WHERE ' + @strWhere + ' ' + @strOrder
  ELSE
   SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + '  FROM ['+ @tblName + '] '+ @strOrder
END
ELSE
BEGIN
  --为搜索表建立自动编号 保存到临时表中
  SET @strSQL = 'SELECT TOP ' + str(@PageIndex*@PageSize) + ' IDENTITY(int,1,1) AS IID, ' + @strGetFields + ' INTO #tmpTable FROM [' + @tblName + ']'
  IF @strWhere != ''
   SET @strSQL = @strSQL + ' WHERE ' + @strWhere + ' ' + @strOrder
  ELSE
   SET @strSQL = @strSQL + @strOrder

  --以下代码赋予了@strSQL以真正执行的SQL代码
  SET @strSQL = @strSQL + ' SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM #tmpTable'
     + ' WHERE IID ' + @strTmp + '(IID) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' IID FROM #tmpTable) AS tblTmp) DROP TABLE #tmpTable'
END

--PRINT @strSQL

--执行分页查询
EXEC (@strSQL)
回复

使用道具 举报

0

主题

9

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-12-10 16:45:01 | 显示全部楼层
USE tempdb
GO

IF OBJECT_ID('dbo.p_Qry') IS NOT NULL
        DROP PROC p_Qry
GO

CREATE PROC dbo.p_Qry
        @TableName sysname,         -- 查询的表名
        @FieldList varchar(8000)    -- 查询结果的字段名列表
AS
SET NOCOUNT ON
        IF OBJECT_ID('tempdb..#qrywhere') IS NULL
        BEGIN
                RAISERROR('must define #qrywhere use script:
CREATE TABLE #qrywhere(FieldName sysname, value sql_variant)', 16, 1)
                RETURN
        END
        DECLARE @s varchar(8000)
        SET @s = ''
        SELECT @s = @s + N' OR ' + QUOTENAME(FieldName)
                + '=(SELECT value FROM #qrywhere WHERE FieldName=N' + QUOTENAME(FieldName, '''') + ')'
        FROM #qrywhere
        IF @@ROWCOUNT > 0
                SET @s = STUFF(@s, 1, 3, ' WHERE')
        EXEC('SELECT ' + @FieldList + ' FROM ' + @TableName + @s)
GO

-- 调用
CREATE TABLE #qrywhere(FieldName sysname, value sql_variant)
EXEC dbo.p_Qry 'sysobjects', '*'

INSERT #qrywhere VALUES('xtype', 'S')
INSERT #qrywhere VALUES('status', 0)
EXEC dbo.p_Qry 'sysobjects', '*'
GO

-- 删除测试
DROP PROC dbo.p_Qry
DROP TABLE #qrywhere
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表