Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:表和列的索引_Sql Server - Fatal编程技术网

Sql server SQL Server:表和列的索引

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

我有一个存储所有表名和列名的表,现在我想根据不同条件的表获取数据

我将使用一个查询列名,表名将从该表中动态获取,然后在select查询中使用,并从相应的列和表中获取数据

表名为
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