Tsql 为MS SQL生成Crystal报表SQL语句

Tsql 为MS SQL生成Crystal报表SQL语句,tsql,crystal-reports,Tsql,Crystal Reports,如果使用内置向导创建Crystal报表,则会链接表等。是什么决定了参数是否进入实际SQL语句?还有,为什么它把所有的东西都用双引号括起来 例如: 下面是CR生成的基本SQL语句: SELECT "poitem"."fpono" , "pomast"."fcompany" , "pomast"."fvendno" , "poitem"."fpartno" , "poitem"."fitemno" , "poitem"."frelsno" ,

如果使用内置向导创建Crystal报表,则会链接表等。是什么决定了参数是否进入实际SQL语句?还有,为什么它把所有的东西都用双引号括起来

例如:

下面是CR生成的基本SQL语句:

SELECT "poitem"."fpono"
,      "pomast"."fcompany"
,      "pomast"."fvendno"
,      "poitem"."fpartno"
,      "poitem"."fitemno"
,      "poitem"."frelsno"
,      "poitem"."fordqty"
,      "poitem"."frcpqty"
,      "poitem"."fucostonly"
,      "poitem"."flstpdate"
FROM "M2MDATA01"."dbo"."pomast" "pomast"
     INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem"
     ON "pomast"."fpono" = "poitem"."fpono"
现在,观察我将以下内容添加到“选择专家编辑器”(select expert editor)时会发生什么:

{poitem.fcategory} = "INV" and
not ({poitem.fmultirls} = "Y" and
{poitem.frelsno} = "  0") and
{poitem.fordqty} > {poitem.frcpqty} and
cdate({poitem.flstpdate}) = {?LastPromDate} and
{poitem.forgpdate} = DateTime (2010, 10, 05, 00, 00, 00) and 
{pomast.fstatus} = "OPEN" 
由于我用两种不同的方式询问日期,所以我添加了上述更新以进行比较

以下是我得到的SQL:

 SELECT "poitem"."fpono"
,      "pomast"."fcompany"
,      "pomast"."fvendno"
,      "poitem"."fpartno"
,      "poitem"."fitemno"
,      "poitem"."frelsno"
,      "poitem"."fordqty"
,      "poitem"."frcpqty"
,      "poitem"."fucostonly"
,      "poitem"."flstpdate"
,      "poitem"."fcategory"
,      "poitem"."fmultirls"
,      "pomast"."fstatus"
,      "poitem"."forgpdate"
FROM "M2MDATA01"."dbo"."pomast" "pomast"
     INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem"
     ON "pomast"."fpono" = "poitem"."fpono"
WHERE     "poitem"."fcategory" = 'INV'
      AND("poitem"."fmultirls" <> 'Y'
          OR "poitem"."frelsno" <> '  0')
      AND "poitem"."fordqty" > "poitem"."frcpqty"
      AND("poitem"."forgpdate" >= {TS '2010-10-05 00:00:00'}
          AND "poitem"."forgpdate" < {TS '2010-10-05 00:00:01'})
      AND "pomast"."fstatus" = 'OPEN'
选择“poitem”。“fpono”
,“pomast”,“fcompany”
,“pomast”,“fvendno”
,“poitem”,“fpartno”
,“poitem”,“fitemno”
,“poitem”,“frelsno”
,“poitem”,“fordqty”
,“点”,“frcpqty”
,“poitem”,“fucostonly”
,“poitem”,“flstpdate”
,“poitem”,“fcategory”
,“poitem”,“fmultirls”
,“pomast”,“fstatus”
,“poitem”,“ForgUpdate”
从“M2MDATA01”、“dbo”、“pomast”到“pomast”
内部联接“M2MDATA01”“dbo”“poitem”“poitem”
在“pomast”上,“fpono”等于“poitem”,“fpono”
其中“poitem”。“fcategory”=“INV”
和(“poitem”,“fmultirls”,“Y”
或“poitem”。“frelsno”或“0”)
和“poitem”、“fordqty”>“poitem”、“frcpqty”
和(“poitem”,“forgpdate”>={TS'2010-10-05 00:00:00}
和“poitem”。“ForgUpdate”<{TS'2010-10-05 00:00:01})
和“pomast”,“fstatus”=“OPEN”
大部分是直接传输的,但是它转换了我的“Not”语句

另外,请注意我的cdate行是如何完全不发送的,而是在水晶内部解析的

有人确切地知道克里斯托是如何决定做什么的吗?我处理一些大型数据库,需要SQL语句中的条件,否则Crystal会返回大量数据集,这会浪费时间、内存和处理

蒂亚

为什么要用双引号括起来

双引号是ansi将对象名称括起来的标准方式。这是一种安全、跨平台的方法,可以确保公司的表名和列名不会与保留关键字发生冲突

问题的主要部分似乎是为什么它会在客户端对变量进行比较。恐怕我帮不了你。我最好的猜测是,这与可用的索引有关,除非Crystal对此了解太多

为什么要用双引号括起来

双引号是ansi将对象名称括起来的标准方式。这是一种安全、跨平台的方法,可以确保公司的表名和列名不会与保留关键字发生冲突


问题的主要部分似乎是为什么它会在客户端对变量进行比较。恐怕我帮不了你。我最好的猜测是,这与可用的索引有关,除非Crystal对此了解得太多。它生成的SQL格式部分取决于Crystal的版本和数据提供程序。如果使用ODBC,它将始终在所有内容周围加引号,因为此语法是ansi标准。在针对SQL Server和其他数据源进行报告时,通常也会采用同样的方法。 但是,例如,如果您在Crystal 8.5中创建报表并使用SQL Server数据源提供程序,它将生成不带引号的SQL(即仅从MyTable中选择一个简单的MyTable.MyField)。我相信,对于任何SQL Server数据源,这种行为在版本9中都发生了更改,但这并不是一个全面的更改。在Crystal 11中,对Informix数据源使用本机提供程序而不是ODBC不会生成上面引用的SQL

至于它如何评估在SQL中做什么,这取决于它在数据源的SQL中可以重写多少。任何使用晶体函数的公式(如您使用的CDate函数)通常只能在晶体本身中进行计算。 为了最大限度地发挥服务器的作用,不要使用任何Crystal函数、摘要字段或Switch语句。它可以再次转换的确切金额取决于提供商。有时根本不可能将其全部转换。
服务器上还可以选择使用索引来提高速度,这可以使事情变得更快,但对在何处执行的操作没有多大帮助。

它生成的SQL格式部分取决于Crystal的版本和数据提供程序。如果使用ODBC,它将始终在所有内容周围加引号,因为此语法是ansi标准。在针对SQL Server和其他数据源进行报告时,通常也会采用同样的方法。 但是,例如,如果您在Crystal 8.5中创建报表并使用SQL Server数据源提供程序,它将生成不带引号的SQL(即仅从MyTable中选择一个简单的MyTable.MyField)。我相信,对于任何SQL Server数据源,这种行为在版本9中都发生了更改,但这并不是一个全面的更改。在Crystal 11中,对Informix数据源使用本机提供程序而不是ODBC不会生成上面引用的SQL

至于它如何评估在SQL中做什么,这取决于它在数据源的SQL中可以重写多少。任何使用晶体函数的公式(如您使用的CDate函数)通常只能在晶体本身中进行计算。 为了最大限度地发挥服务器的作用,不要使用任何Crystal函数、摘要字段或Switch语句。它可以再次转换的确切金额取决于提供商。有时根本不可能将其全部转换。
还可以选择在服务器上使用索引来提高速度,这可以使事情变得更快,但实际上对在何处执行的操作没有多大帮助。

如果使用命令对象,而不是单个表,则可以更好地控制SQL语句。数据库|数据库专家…,展开所需数据库服务器的根nood,然后单击“添加命令”。输入所需的SQL语句。根据需要添加参数

在中创建的参数