【问题标题】:SQL Dynamic SELECT statement from values stored in a table从存储在表中的值的 SQL 动态 SELECT 语句
【发布时间】:2011-07-09 18:32:06
【问题描述】:

我已经研究了几天,感觉自己在绕圈子。我对 SQL 有基本的了解,但有很多地方我不明白。

我有一个表,其中存储了我的数据库中所有其他表的名称和字段。

tblFields
===================================================

TableName      FieldName     BookmarkName  
---------------------------------------------------
Customer       FirstName     CustomerFirstName  
Customer       LastName      CustomerLastName  
Customer       DOB           CustomerDOB  

我想写一个SELECT 声明如下,但我无法让它工作:

SELECT (SELECT [FieldName] FROM [TableName]) FROM tblFields

这可能吗?我开发的应用程序要求用户自定义报告。

【问题讨论】:

  • 我不明白你想做什么。
  • 您可以使用字符串构造函数来创建此查询 - 尽管可能必须使用另一种语言(例如 C#)来构造查询,然后针对 DB 运行它。
  • 您需要说明 RDBMS(和版本)。

标签: sql sql-server select dynamic-sql


【解决方案1】:

如果我了解您要做什么,我认为这会对您有所帮助。它并不漂亮,它适用于 SQL Server 2005 及更高版本,但也许这就是您要寻找的:

declare @tableName nvarchar(100)
declare @sqlQuery nvarchar(max)
declare @fields varchar(500)
set @tableName = 'YourTableName'
set @fields = ''
select @fields = @fields + QUOTENAME(t.fieldname) + ',' from (
select distinct fieldname from tblfields where tablename = @tableName)t


set @sqlQuery = 'select ' + left(@fields, LEN(@fields)-1) + ' from ' + QUOTENAME(@tableName)

execute sp_executesql @sqlQuery

编辑:正如 Martin 建议的那样,我进行了编辑,以便列和表名使用 QUOTENAME

【讨论】:

  • 列名和表名应该使用QUOTENAME
  • 您好,Radu,谢谢您的回答。像迈克尔一样,你的答案基本上就是我想出的。我将迈克尔的答案标记为正确,因为他首先回答。 :)
【解决方案2】:

如果我正确理解您要执行的操作,则最好将其作为程序中的两个单独查询来执行。一个获取您要选择的字段,然后在程序中使用这些字段来构建第二个查询,该查询实际上获取数据。

如果必须完全在 SQL 中完成,那么您需要告诉我们您使用的是什么数据库。如果是 SQL Server,您可能能够在第一个查询上使用游标来构建第二个查询,然后使用 sp_executesql 存储过程执行该查询。但建议在 SQL 之外进行。

【讨论】:

  • 嗨,迈克尔,感谢您的回答。发布问题后,我离开并修补了一段时间,但您的答案基本上是我想出的。
  • 我有一个书签表,其中列出了数据库中的每个字段和一个相关的书签名称。我有第二个表,其中列出了我想用数据库值替换的 Word 文档中的所有书签。我正在使用一个存储过程,它从包含书签名称和值的两个表生成 XML 代码,然后我用它们来更新 Word 文档。
猜你喜欢
  • 2017-09-26
  • 2013-02-17
  • 2021-01-28
  • 2013-06-14
  • 2013-06-30
  • 2011-04-20
  • 2010-12-24
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多