【问题标题】:SELECT fieldnames FROM dynamic SQL query从动态 SQL 查询中选择字段名
【发布时间】:2014-06-17 15:25:42
【问题描述】:

我有一个存储过程,它使用多个参数来构建我执行的动态查询。查询工作正常,但是,此过程将成为 Crystal Report 的数据源,需要它可以引用的“静态”SELECT with field names。 Crystal Report 从 Visual Basic 应用程序中调用,并获取从应用程序传递给它的参数。它反过来将参数传递给 SQL Server 存储过程。

不知何故我需要

SELECT fieldname1, fieldname2 
FROM Exec(@MydynamcSQL)

在我构建 @MydynamcSQL 之后。这是一个复杂的应用程序,它可以根据年份访问特定的表,并根据用户访问特定的数据库。我对 SQL 很陌生,所以也许还有其他我不知道的方法可以使用?

【问题讨论】:

  • 您使用的是什么类型的数据库?微软 SQL 服务器?什么版本(年份)?如果添加更具体的标签,将有助于回答问题,因为这种类型的 SQL 非常依赖于数据库的类型。
  • @Chipmonkey 我认为这是 T-SQL,PL/SQL 对动态 sql 有不同的语法。
  • Microsoft SQL Server 2008 R2

标签: sql tsql crystal-reports


【解决方案1】:

尝试创建一个临时表来临时插入数据,然后从该表中选择:

DECLARE @MydynamcSQL varchar(1000);

SET @MydynamcSQL = 'select fieldname1, fieldname1 from table1';

CREATE TABLE #Result
(
  fieldname1 varchar(1000),
  fieldname2 varchar(1000)  
)
INSERT #Result Exec(@MydynamcSQL)
SELECT fieldname1, fieldname1 -- here you have "static SELECT with field names"
FROM #Result 
DROP TABLE #Result

【讨论】:

  • 我认为这条路线可能是我唯一的选择。我会试试这个,看看它是如何与 Crystal 一起工作的。
  • 我从事报告工作有一段时间了,我想我知道您的问题,通常报告中的这类问题可以通过临时表解决。这是一个粗略的解决方案,如果我想到一些不同的东西,我会告诉你。
  • 如果我有多个用户同时运行此报告,SQL Server 是否会为每个用户制作唯一版本的临时表?
  • 是的,它们是在批处理或过程中创建和删除的,理论上不需要 DROP TABLE #Result。
  • 即使每个用户都创建了一个同名的临时表,它也将是特定于用户的。
【解决方案2】:

您是否尝试过让 who 事物动态化,例如:

Exec( 'SELECT fieldname1, fieldname2 FROM ' + @MydynamcSQL)

值得注意的是,虽然超出范围,但请确保您不会受到 sql 注入攻击。参数化的动态查询可能会让您暴露。

【讨论】:

  • 我的问题在于动态部分。当我附加存储过程时,Crystal Reports 看不到任何数据字段,因此我没有任何东西可以用来构建报表。至于 sql 注入,我的 [桌面] 应用程序将传递我将构建的参数。该应用将拥有一个小的内部用户群。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2019-10-13
  • 2012-01-17
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多