Tsql 为MS SQL生成Crystal报表SQL语句
如果使用内置向导创建Crystal报表,则会链接表等。是什么决定了参数是否进入实际SQL语句?还有,为什么它把所有的东西都用双引号括起来 例如: 下面是CR生成的基本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" ,
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语句。根据需要添加参数 在中创建的参数