我想从一些具有字段名称criteria1的表中提取特定行。我遇到的问题是,当我将所有者和表名组合在一起并尝试调用“select where1 from @t where linenum = 1”时,SQL期望@t成为一个表。我需要知道如何构造完整的表名,然后将其传递给此查询。我知道我可以使用一种编程语言来访问数据库,但我需要将它放在SQL中。如果有人知道更好的方法,这也会很棒。
declare @next as varchar
declare @owner varchar
while 1=1
begin
set @next = (select top 1 o.name FROM syscolumns c inner join sysobjects o on c.id = o.id
where c.name = 'criteria1' and o.id > @next order by o.id)
if @next is null
break
else
begin
set @owner = (select top 1 u.name
FROM syscolumns c inner join
sysobjects o on c.id = o.id left join
sysusers u on o.uid=u.uid
where c.name = 'criteria1' and o.id = @next order by o.id)
declare @t as varchar
set @t = @owner+'.'+@next
select criteria1 from @t where linenum = 1
end
continue
end
答案 0 :(得分:4)
您可以将所需的整个查询构建为varchar(),然后使用sp_executesql
存储过程执行它。
http://msdn.microsoft.com/en-us/library/ms188001.aspx
在你的情况下,最后的那一位变成
declare @sql varchar(512);
set @sql = 'select criteria1 from ' + @t + ' where linenum = 1'
sp_executesql @sql
答案 1 :(得分:2)
您是否考虑过存储过程中的以下构造?
CASE @tablename
WHEN 'table1' THEN SELECT * FROM table1
WHEN 'table2' THEN SELECT * FROM table2
WHEN 'table3' THEN SELECT * FROM table3
WHEN 'table4' THEN SELECT * FROM table4
END
如果您与动态SQL结合(被认为是此问题空间的错误选择),this guide to dynamic SQL should help a lot。它帮助了我和我广泛使用动态SQL。
答案 2 :(得分:1)
感谢所有帮助。这就是我最终的结果。
declare cur cursor for
select u.name + '.' + o.name tname
FROM sysobject o left join
syscolumns c on c.id = o.id left join
sysusers u on o.uid=u.uid
where c.name = 'criteria1'
declare @tn as varchar(512)
open cur
fetch next from cur into @tn
create table holding_table ( val varchar(512), table_name varchar(512))
declare @sql nvarchar(1000)
while @@FETCH_STATUS = 0
begin
set @sql = 'insert into holding_table select criteria1, ''' + @tn + ''' from ' + @tn + ' where linenum = 1'
execute sp_executesql @sql
fetch next from cur into @tn
end
close cur
deallocate cur
答案 3 :(得分:0)
也许可以在这里使用视图?
CREATE VIEW vCriterias
AS
SELECT 'Table1' AS TableName,
linenum,
criteria1
FROM Table1
UNION ALL
SELECT 'Table2' AS TableName,
linenum,
criteria1
FROM Table2
UNION ALL
SELECT 'Table3' AS TableName,
linenum,
criteria1
FROM Table3
go
然后选择就像:
SELECT criteria1
FROM vCriterias
WHERE linenum = 3
AND TableName IN ('Table1','Table3')