Sql server SQL Server:表和列的索引
我有一个存储所有表名和列名的表,现在我想根据不同条件的表获取数据 我将使用一个查询列名,表名将从该表中动态获取,然后在select查询中使用,并从相应的列和表中获取数据 表名为Sql server SQL Server:表和列的索引,sql-server,Sql Server,我有一个存储所有表名和列名的表,现在我想根据不同条件的表获取数据 我将使用一个查询列名,表名将从该表中动态获取,然后在select查询中使用,并从相应的列和表中获取数据 表名为ADE\u ColumnIndexing 在这个表中,所有表名都是TableNamecolumn,列名是namecolumn 现在我想用 select fieldname from tablename where Id = newdata 此查询将返回该列和表的数据。。。我的意思是tablename=ade\u lo
ADE\u ColumnIndexing
在这个表中,所有表名都是TableName
column,列名是name
column
现在我想用
select fieldname
from tablename
where Id = newdata
此查询将返回该列和表的数据。。。我的意思是tablename=ade\u log和columnname=history
所以我的查询将是从ade_日志中选择历史。。。有可能吗?有可能构建和执行动态sql,尽管这似乎不是一个好方法:
DECLARE @Sql varchar(max)
SELECT @Sql = 'SELECT '+ ColumnName +
' FROM '+ TableName +
' WHERE Id = '+ IdValue
FROM ADE_ColumnIndexing
WHERE TableName = @TableName
AND ColumnName = @ColumnName
EXEC(@Sql)
我认为如果您使用ID列进行搜索,绝对不推荐使用,因为在我看来,IDVal是自动递增的(如果我错了,请纠正我)。那为什么不用呢
exec('select [' + @column_name + '] from [' + @tablename + ']');
如果要在表或列存在时添加验证,可以在sys中查询
if (
select
COUNT(*)
from sys.tables tb
left join sys.columns c
on
tb.object_id = c.object_id
where
tb.name = @tablename
and c.name = @columnname
) != 0
begin
exec('select [' + @column_name + '] from [' + @tablename + ']');
end
else
begin
select 'table or column does not exist'
end
编辑:似乎您的表中有一行“查询”,如果我理解正确,请参阅下面的简单脚本…(希望如此)
编辑:这是我最后一次尝试你的案子。请尝试此示例代码集,它仍然使用表:[test]和表:[test1]
DECLARE @intloop INT = 1 -- variable setter for number of loops
,@qry nvarchar(4000) = '' -- variable setter for the looping query
SELECT ROW_NUMBER() OVER (ORDER BY qry) AS id, qry INTO #tmpQueries FROM [test] -- create temp table for fake 'id'
CREATE TABLE #tmpQuery (id int, qry nvarchar(4000), res nvarchar(4000)) -- table result container
CREATE TABLE #tmpInsert (res nvarchar(4000)) -- execute query container
WHILE (@intloop < (SELECT COUNT(*) FROM #tmpQueries) + 1)
BEGIN
SET @qry = (SELECT TOP 1 qry FROM #tmpQueries WHERE id = @intloop) -- get the qry base from ID
DELETE FROM #tmpInsert -- delete records of query container
INSERT INTO #tmpInsert -- insert records into query container
EXEC (@qry) -- execute qry
INSERT INTO #tmpQuery (id, qry, res)
VALUES (@intloop, @qry, (SELECT TOP 1 res FROM #tmpInsert)) -- transfer id, qry and result into #tmpQuery table
SET @intloop = @intloop + 1 -- increment record
END
SELECT * FROM #tmpQuery -- select all records in #tmpQuery table
DROP TABLE #tmpQueries
DROP TABLE #tmpQuery
DROP TABLE #tmpInsert
简化脚本:假设test和test1的所有ID都是同级的,您可以用这种方式简单地执行查询
declare @myqry2 nvarchar(4000) = SUBSTRING(
(SELECT qry + ' union all ' AS [text()] FROM test FOR XML PATH(''))
,0
,LEN((SELECT qry + ' union all ' AS [text()] FROM test FOR XML PATH(''))) - 9
)
CREATE TABLE #tmpResult(id int, qry nvarchar(4000))
INSERT INTO #tmpResult
EXEC(@myqry2) -- execute @myqry2
SELECT
tr.id
, t.qry
, tr.qry AS [sales]
FROM [test] t
LEFT JOIN #tmpResult tr
ON
t.id = tr.id
DROP TABLE #tmpResult
编辑:我们可以删除子字符串,但根据您的要求,所有行必须在单个表结果中,因此“union all”不能取消,除非您有自己的方式,这是一个加号
select
*,
case
when id = 1 then ' union all '
when id = 2 then ' union all '
else ''
end as [row_extender]
into #tmptest
from test
--drop table #tmptest
declare @myqry2 nvarchar(4000) = (SELECT qry + row_extender AS [text()] FROM #tmptest FOR XML PATH(''))
CREATE TABLE #tmpResult(id int, qry nvarchar(4000))
INSERT INTO #tmpResult
EXEC(@myqry2) -- execute @myqry2
SELECT
tr.id
, t.qry
, tr.qry AS [sales]
FROM [test] t
LEFT JOIN #tmpResult tr
ON
t.id = tr.id
DROP TABLE #tmpResult
DROP TABLE #tmptest
澄清:我在一个表中有3个字段:1是ColumnName,2是TableName,3是Idvalue,现在我将进行一个select查询,它将从TableName中获取select ColumnName,其中id=Idvalue,表示,..t这将为存储在此表中的所选tablename提供输出…我希望使用sql查询通过系统架构获得任意表数据…对我来说,这似乎是一个糟糕的设计。是的,Zohar,仅查看此注释:我是否可能希望使用sql查询通过系统架构获得任意表数据…为什么不直接从表中选择?为什么要生成动态sql?我遇到以下错误:无法绑定多部分标识符“ci.ColumnName”。请使用
print@sql
而不是exec(@sql)
复制sql语句并粘贴到注释中。我的答案中没有ci
标识符,所以我不明白你是从哪里得到的。我在表中有一个ID列和查询列,在查询列中我有多行select查询,现在我可以得到这个查询列的ID、查询和输出列的输出吗?现在我完全迷路了。我不明白这和我要求你做的有什么关系。请考虑编辑您的问题,以便它清楚地反映您的数据库。这是我的新查询,我用另一种方式做这件事,我在表中有ID栏和查询列,在查询栏中,我有多行带有选择查询,现在我可以用ID获得输出,此查询列的查询和输出列?我的案例是:查询(表的列名)选择ClosureComment from EM_Note其中Id=3选择ClosureComment from EM_Note其中Id=15选择Progress from EM_Update其中Id=4选择Progress from EM_Update其中Id=7现在我想使用一次性sql查询输出第二别名中的所有查询我问,为什么要在Id中查询?ID列是硬编码的,不是自动递增的吗?我的朋友,查询是列名,所有select查询都是该列的行,所以ID有什么问题,我只想在一个新列上,我希望所有这些行的输出简单地平行..好的,先生,请看我的编辑,希望这次我能正确理解你的意思。不是gud先生,我不明白为什么你不理解我的查询,我只是说我有一个表,有两列,第一列是ID,第二列是查询,第二列有5行,每行有新的select查询,现在我想把这列的输出作为第三列,我怎么知道呢,,
declare @myqry2 nvarchar(4000) = SUBSTRING(
(SELECT qry + ' union all ' AS [text()] FROM test FOR XML PATH(''))
,0
,LEN((SELECT qry + ' union all ' AS [text()] FROM test FOR XML PATH(''))) - 9
)
CREATE TABLE #tmpResult(id int, qry nvarchar(4000))
INSERT INTO #tmpResult
EXEC(@myqry2) -- execute @myqry2
SELECT
tr.id
, t.qry
, tr.qry AS [sales]
FROM [test] t
LEFT JOIN #tmpResult tr
ON
t.id = tr.id
DROP TABLE #tmpResult
select
*,
case
when id = 1 then ' union all '
when id = 2 then ' union all '
else ''
end as [row_extender]
into #tmptest
from test
--drop table #tmptest
declare @myqry2 nvarchar(4000) = (SELECT qry + row_extender AS [text()] FROM #tmptest FOR XML PATH(''))
CREATE TABLE #tmpResult(id int, qry nvarchar(4000))
INSERT INTO #tmpResult
EXEC(@myqry2) -- execute @myqry2
SELECT
tr.id
, t.qry
, tr.qry AS [sales]
FROM [test] t
LEFT JOIN #tmpResult tr
ON
t.id = tr.id
DROP TABLE #tmpResult
DROP TABLE #tmptest