求解决一个Sql查询问题,表字段作为表名查询的问题?

时间:2022-07-24 09:26:26
我要查询一个 Tasks表里面的数据, 有字段  ID,TaskTabelName

,但是我要统计 TaskTabelName 里面的数据


我是打算这样在存储过程里这样写的: select *,(select * from Task.TaskTabelName) from Task

但是 老报一个少个括号

求大神指教一下,我是菜鸟

8 个解决方案

#1


表名不能这样弄,用游标也不太对。。求大神

#2


TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补

#3


引用 2 楼  的回复:
TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补

我表达的不清楚?
表Task
  TaskID, TaskSendToGroups TaskSendDateTime, TaskTableName, TaskLinkeTable
   1      1                2012-06-24 07:00  EDM_Dynamic_1   EDM_Links_1    
   2      1,2                2012-06-24 07:00  EDM_Dynamic_2   EDM_Links_2
其中EDM_Dynamic1、EDM_Dynamic2动态创建的表
我要查询出Task表中的数据,并且要统计出 EDM_Dynamic_1,和EDM_Dynamic_2表中的数据

#4


子查寻语法有问题吧,tasktablename是列,那* 是什么。
没见过这样写的。

#5


你这是列里面存的表名字,想逐行检索select只能动态拼接sql去执行,用游标和表变量都可以。
类似于

select @tablename = TaskTableName FROM task WHERE ...
EXEC ('SELECT * FROM ' + @tablename)

用游标或表变脸循环执行上面的语句就好了

#6


引用 5 楼  的回复:
你这是列里面存的表名字,想逐行检索select只能动态拼接sql去执行,用游标和表变量都可以。
类似于
SQL code

select @tablename = TaskTableName FROM task WHERE ...
EXEC ('SELECT * FROM ' + @tablename)


用游标或表变脸循环执行上面的语句就好了


TaskID, TaskSendToGroups TaskSendDateTime, TaskTableName, TaskLinkeTable
 1 1 2012-06-24 07:00 EDM_Dynamic_1 EDM_Links_1   
  2 1,2 2012-06-24 07:00 EDM_Dynamic_2 EDM_Links_2
好像都没太理解我的意思。 我的意思是 在我查询Task表分页的时候,统计出表EDM_Dynamic_1、EDM_Dynamic_2中的数据,作为Task表的一列显示出来
::
大概是这么意思, 我要的是一步到位,
select *,(select count(*) from Task.TaskTableName)as Num from Task

---------------------下面是我的存储过程---------------
USE [TopenEDM]
GO
/****** Object:  StoredProcedure [dbo].[EDM_TasksList]    Script Date: 06/24/2012 09:21:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE  [dbo].[EDM_TasksList]
--TaskID, TaskChannels, Task_ReplyTo, TaskSendToGroups, TaskExclusionsGroups, Task_EMID, TaskSendDateTime, TaskTableName, TaskState, Task_CreateUID, TaskCreateDate
    @PageSize INT,
    @PageIndex INT,
    @RecordCount INT OUTPUT
        
AS
BEGIN

  -- BEGIN TRAN
   DECLARE @Sql NVARCHAR(MAX), @Where NVARCHAR(MAX),@taskTableName nvarchar(50),@count int,@tabsql nvarchar(max)
   ,@num int
   --默认值 @SQL 语句取得总行数 
    SET @Sql = 'SELECT @RecordCount = COUNT(1) FROM EDM_Tasks '
    set @Where=''
    
    IF(@Where != '') SET @Where = ' WHERE ' + @Where

    --合并 @SQL 查询行数
    SET @Sql = @Sql + @Where
    
    --合并 @SQL 查询
    SET @Sql = 'SELECT * FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY TaskID DESC) AS RowNumber, EDM_Tasks.*,dbo.EDM_FN_GetGroupsNameByIDs(EDM_Tasks.TaskSendToGroups,null,null) AS SendGroupsName,dbo.EDM_FN_GetGroupsNameByIDs(EDM_Tasks.TaskExclusionsGroups,null,null) AS ExclusionsGroupsName,dbo.EDM_GetEmailIDByName(EDM_Tasks.Task_EMID) as TaskEmailName FROM EDM_Tasks ' + @Where + ') as tmp 
    WHERE RowNumber BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize'
    
     EXEC sp_executesql @Sql,
    N'@PageSize INT,
    @PageIndex INT',
    @PageSize,
    @PageIndex
 
        
END

#7


既然你都用存储过程了,那就用游标吧

declare @tablename nvarchar(100)
--创建临时表
select *,[count] into #emd_tasks from EDM_Tasks
declare @cursor cursor
set @cursor=cursor for select name from EDM_Tasks
open @cursor
fetch next from @cursor into @tablename
while(@@fetch_status=0)begin
begin
--print 'update #emd_tasks set [count] = (select count(1) from '+ @tablename+') where TaskTableName = '''+@tablename+''''
exec('update #emd_tasks set [count] = (select count(1) from '+ @tablename+') where TaskTableName = '''+@tablename+'''')
fetch next from @cursor into @tablename
end
close @cursor
deallocate @cursor
select * from #emd_tasks

没有数据调试,你自己调吧,不知道你要的是不是这样的效果

#8


晕,帖子怎么不能再编辑的。第二行可能要该下

select *,0 as [count] into #emd_tasks from EDM_Tasks

#1


表名不能这样弄,用游标也不太对。。求大神

#2


TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补

#3


引用 2 楼  的回复:
TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补

我表达的不清楚?
表Task
  TaskID, TaskSendToGroups TaskSendDateTime, TaskTableName, TaskLinkeTable
   1      1                2012-06-24 07:00  EDM_Dynamic_1   EDM_Links_1    
   2      1,2                2012-06-24 07:00  EDM_Dynamic_2   EDM_Links_2
其中EDM_Dynamic1、EDM_Dynamic2动态创建的表
我要查询出Task表中的数据,并且要统计出 EDM_Dynamic_1,和EDM_Dynamic_2表中的数据

#4


子查寻语法有问题吧,tasktablename是列,那* 是什么。
没见过这样写的。

#5


你这是列里面存的表名字,想逐行检索select只能动态拼接sql去执行,用游标和表变量都可以。
类似于

select @tablename = TaskTableName FROM task WHERE ...
EXEC ('SELECT * FROM ' + @tablename)

用游标或表变脸循环执行上面的语句就好了

#6


引用 5 楼  的回复:
你这是列里面存的表名字,想逐行检索select只能动态拼接sql去执行,用游标和表变量都可以。
类似于
SQL code

select @tablename = TaskTableName FROM task WHERE ...
EXEC ('SELECT * FROM ' + @tablename)


用游标或表变脸循环执行上面的语句就好了


TaskID, TaskSendToGroups TaskSendDateTime, TaskTableName, TaskLinkeTable
 1 1 2012-06-24 07:00 EDM_Dynamic_1 EDM_Links_1   
  2 1,2 2012-06-24 07:00 EDM_Dynamic_2 EDM_Links_2
好像都没太理解我的意思。 我的意思是 在我查询Task表分页的时候,统计出表EDM_Dynamic_1、EDM_Dynamic_2中的数据,作为Task表的一列显示出来
::
大概是这么意思, 我要的是一步到位,
select *,(select count(*) from Task.TaskTableName)as Num from Task

---------------------下面是我的存储过程---------------
USE [TopenEDM]
GO
/****** Object:  StoredProcedure [dbo].[EDM_TasksList]    Script Date: 06/24/2012 09:21:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE  [dbo].[EDM_TasksList]
--TaskID, TaskChannels, Task_ReplyTo, TaskSendToGroups, TaskExclusionsGroups, Task_EMID, TaskSendDateTime, TaskTableName, TaskState, Task_CreateUID, TaskCreateDate
    @PageSize INT,
    @PageIndex INT,
    @RecordCount INT OUTPUT
        
AS
BEGIN

  -- BEGIN TRAN
   DECLARE @Sql NVARCHAR(MAX), @Where NVARCHAR(MAX),@taskTableName nvarchar(50),@count int,@tabsql nvarchar(max)
   ,@num int
   --默认值 @SQL 语句取得总行数 
    SET @Sql = 'SELECT @RecordCount = COUNT(1) FROM EDM_Tasks '
    set @Where=''
    
    IF(@Where != '') SET @Where = ' WHERE ' + @Where

    --合并 @SQL 查询行数
    SET @Sql = @Sql + @Where
    
    --合并 @SQL 查询
    SET @Sql = 'SELECT * FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY TaskID DESC) AS RowNumber, EDM_Tasks.*,dbo.EDM_FN_GetGroupsNameByIDs(EDM_Tasks.TaskSendToGroups,null,null) AS SendGroupsName,dbo.EDM_FN_GetGroupsNameByIDs(EDM_Tasks.TaskExclusionsGroups,null,null) AS ExclusionsGroupsName,dbo.EDM_GetEmailIDByName(EDM_Tasks.Task_EMID) as TaskEmailName FROM EDM_Tasks ' + @Where + ') as tmp 
    WHERE RowNumber BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize'
    
     EXEC sp_executesql @Sql,
    N'@PageSize INT,
    @PageIndex INT',
    @PageSize,
    @PageIndex
 
        
END

#7


既然你都用存储过程了,那就用游标吧

declare @tablename nvarchar(100)
--创建临时表
select *,[count] into #emd_tasks from EDM_Tasks
declare @cursor cursor
set @cursor=cursor for select name from EDM_Tasks
open @cursor
fetch next from @cursor into @tablename
while(@@fetch_status=0)begin
begin
--print 'update #emd_tasks set [count] = (select count(1) from '+ @tablename+') where TaskTableName = '''+@tablename+''''
exec('update #emd_tasks set [count] = (select count(1) from '+ @tablename+') where TaskTableName = '''+@tablename+'''')
fetch next from @cursor into @tablename
end
close @cursor
deallocate @cursor
select * from #emd_tasks

没有数据调试,你自己调吧,不知道你要的是不是这样的效果

#8


晕,帖子怎么不能再编辑的。第二行可能要该下

select *,0 as [count] into #emd_tasks from EDM_Tasks