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

下一秒_待续 2012-06-23 02:44:22
我要查询一个 Tasks表里面的数据, 有字段 ID,TaskTabelName

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


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

但是 老报一个少个括号

求大神指教一下,我是菜鸟
...全文
371 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cakecc 2012-06-26
  • 打赏
  • 举报
回复
晕,帖子怎么不能再编辑的。第二行可能要该下

select *,0 as [count] into #emd_tasks from EDM_Tasks
cakecc 2012-06-26
  • 打赏
  • 举报
回复
既然你都用存储过程了,那就用游标吧

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

没有数据调试,你自己调吧,不知道你要的是不是这样的效果
孤独加百列 2012-06-24
  • 打赏
  • 举报
回复
你这是列里面存的表名字,想逐行检索select只能动态拼接sql去执行,用游标和表变量都可以。
类似于

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

用游标或表变脸循环执行上面的语句就好了
houxiaoqiangzi 2012-06-24
  • 打赏
  • 举报
回复
子查寻语法有问题吧,tasktablename是列,那* 是什么。
没见过这样写的。
下一秒_待续 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补
[/Quote]
我表达的不清楚?
表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表中的数据
下一秒_待续 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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

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


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

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
發糞塗牆 2012-06-23
  • 打赏
  • 举报
回复
TaskTabelName你的这个是一个列还是一个表?如果是一个列那你这个连第一范式都不满足的。就要修改表结构。而不是去考虑怎么用。
最好给出表结构和几条数据,不然瞎猜于事无补
下一秒_待续 2012-06-23
  • 打赏
  • 举报
回复
表名不能这样弄,用游标也不太对。。求大神

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧