Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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查询中使用一个查询的结果_Sql_Sql Server_Stored Procedures_Dynamic Sql - Fatal编程技术网

在另一个sql查询中使用一个查询的结果

在另一个sql查询中使用一个查询的结果,sql,sql-server,stored-procedures,dynamic-sql,Sql,Sql Server,Stored Procedures,Dynamic Sql,我有以下表格结构: 表1 ╔═════╦══════╦═════════════╦═════════════╗ ║Col1 ║ Col2 ║ TableName ║ ColumnName ║ ╠═════╬══════╬═════════════╬═════════════╣ ║ 1 ║ abc ║ Table2 ║ column2 ║ ║ 2 ║ xyz ║ ║ ║ ║ 3 ║ pqr ║ Table1

我有以下表格结构:

表1

╔═════╦══════╦═════════════╦═════════════╗
║Col1 ║ Col2 ║ TableName   ║ ColumnName  ║
╠═════╬══════╬═════════════╬═════════════╣
║  1  ║ abc  ║ Table2      ║ column2     ║
║  2  ║ xyz  ║             ║             ║
║  3  ║ pqr  ║ Table1      ║ column1     ║
║  4  ║ jbn  ║             ║             ║
╚═════╩════════════════════╩═════════════╝

Table2 :   

 ╔════════╦═════════╗
 ║Column1 ║ Column2 ║
 ╠════════╬═════════╣
 ║  1     ║ A       ║
 ║  2     ║ B       ║
 ║  3     ║ C       ║
 ║  4     ║ D       ║
 ╚════════╩═════════╝

Table3

╔════════╦═════════╗
║Column1 ║ Column2 ║
╠════════╬═════════╣
║  1     ║ X       ║
║  2     ║ Y       ║
║  3     ║ Z       ║
║  4     ║ A       ║
╚════════╩═════════╝
我想编写一个存储过程,它将根据Table1中列tableName和columnName的值选择Table1中的数据和另一个表中的数据

我需要以下格式的数据:

╔═════╦═════╦════════╗
║Col1 ║ Col2║ List   ║
╠═════╬═════╬════════╣
║  1  ║ abc ║A,B,C,D ║
║  2  ║ xyz ║        ║
║  3  ║ pqr ║1,2,3,4 ║
║  4  ║ jbn ║        ║
╚═════╩═════╩════════╝
试试临时桌子。
请看这里:

您需要一个动态sql来获得这样的选择。查看链接

编辑:

下面的代码应该可以做到这一点

我假设表1中的Col1列是int类型

我已使用临时表生成所需的表。您可以根据您的方便将其更换到您的桌子上。我还使用了表1,您可以将其替换为表1

此外,这可能不是很好的性能方面,但这是最好的,我可以想出现在

declare @count int, @Query VARCHAR(5000), @counter int, @tableName VARCHAR(50), @ColumnName VARCHAR(50), @Col1 INT, @Col2 VARCHAR(50)
select @count = count(0) from #table1
SET @counter = 1

CREATE TABLE #table4
(
    Col1 INT,
    Col2 VARCHAR(50),
    List VARCHAR(50)
)

WHILE @counter <= @count
BEGIN
    SELECT @tableName = TableName, @ColumnName = columnName, @Col1 = Col1, @Col2 = Col2 FROM #Table1 WHERE Col1 = @counter

    SELECT @Query = 'INSERT INTO #table4 (Col1 , Col2) VALUES (' + CONVERT(varchar(50),@Col1) + ', ''' + @Col2 + ''')'
    EXEC (@Query)
    SELECT @Query = ''

    IF ISNULL(@tableName, '') != '' AND ISNULL(@ColumnName, '') != ''
    BEGIN
        SELECT @Query = 'UPDATE #table4 SET LIST = STUFF((SELECT '','' + CONVERT(VARCHAR(50), ' + @ColumnName + ') FROM ' + @tableName + ' FOR XML PATH('''')),1,1,'''') WHERE Col1 = ' + CONVERT(varchar(50),@Col1)

        EXEC (@Query)
    END
    SET @counter = @counter + 1
END

SELECT * FROM #table4

希望这有助于

为合并n行而编辑的答案

代码


你能根据我的表格结构举个例子吗?谢谢@samar。我知道我需要动态sql,但我无法创建这样的查询来返回我想要的数据。所以,你能给出一个基于我的表结构的动态查询的例子吗?这是我的荣幸@丽图:我试过了,但没用。它用逗号分隔表名和列名。但我希望列逗号的值被分隔。@Chandnisha:我得到的输出是列1 qwer asdff zxcvb。这是表1第1列的值。您正在使用哪个数据库?在您的表中,只有一行,这就是您获得输出的原因。添加更多行并尝试此解决方案。这是行不通的。
 drop table #temp1
declare @tabletemp as varchar (10)
declare @columntemp as varchar (10)
Declare @sqlTemp NVARCHAR(400)
declare @counter1 as int
declare @counter2 as int
select @counter2 = 1

select name,cname into #temp1 from test1
select @counter1 = COUNT(*) from #temp1


while (@counter2<= @counter1)
begin
SET @tabletemp = (SELECT MIN(name) FROM #temp1)
select @columntemp = (select min(cname) from #temp1 where #temp1.name = @tabletemp)

set @sqlTemp='select '+@columntemp +'  from '+@tabletemp
exec(@sqlTemp)

delete from #temp1 where name = @tabletemp and cname = @columntemp

select @counter1 = COUNT(*) from #temp1
end
select * from test1 
name    cname
table1  column1
test2   colname
table1  test
test2   name
select column1 from table1
column1
qwer
asdff
zxcvb
qwer
asdff
zxcvb
select colname from test2
colname
testing
wer
ewrth
sfsf
testing
wer
ewrth
sfsf
select test from table1
--got error message inavlid column nae 'test' as this column does not exist
select name from test2 
name
table1
table1
table3
table2
table1
table1
table3
table2