具有主机变量的嵌入式SQL中的SQL Server存储过程

时间:2018-10-19 12:01:27

标签: sql-server tsql embedded-sql

在MicroFocus Cobol中,我正在使用主机变量创建存储过程。 SQL代码是这样的:

 CREATE PROCEDURE dbo.LLPSY_PK1_BPS_PROC_INDEX  
 AS 
 BEGIN 
     IF EXISTS (SELECT * FROM sysobjects 
                WHERE id = object_id(N'LLPSY_PK1_BPS_INDEX ') 
                  AND OBJECTPROPERTY(id, N'IsTable') = 1) 
        DROP TABLE LLPSY_PK1_BPS_INDEX 

     IF EXISTS (SELECT * FROM sysobjects 
                WHERE id = object_id(N'LLPSY_PK1_BPS_INDEX_1    ') 
                  AND OBJECTPROPERTY(id, N'IsTable') = 1) 
        DROP TABLE LLPSY_PK1_BPS_INDEX_1    

     IF EXISTS (SELECT * FROM sysobjects 
                WHERE id = object_id(N'LLPSY_PK1_BPS_INDEX_2    ') 
                  AND OBJECTPROPERTY(id, N'IsTable') = 1) 
        DROP TABLE LLPSY_PK1_BPS_INDEX_2    

     SELECT 
         PAYMENT_REF = CASE C.ACNT_TYPE WHEN 1 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 0 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 2 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 4 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))END ,A.ACCNT_CODE AS ACCOUNT,BANKNO=CASE WHEN E.BANK_ACNT_NUM IS NULL THEN''ELSE E.BANK_ACNT_NUM END,AMOUNT=CASE WHEN A.AMOUNT>0 THEN A.AMOUNT ELSE A.AMOUNT*-1 END,A.D_C AS AMOUNT_DC,OTHER_AMOUNT=CASE WHEN A.OTHER_AMT>0 THEN A.OTHER_AMT ELSE A.OTHER_AMT*-1 END,A.D_C AS OTHER_AMOUNT_DC,CAST(A.ACCNT_CODE AS NCHAR(15))+CAST(A.PERIOD AS NCHAR(07))+CONVERT(CHAR(16),A.TRANS_DATETIME,112)AS LEDGER_KEY,CAST(A.JRNAL_NO AS NUMERIC(09))AS JN,CAST(A.JRNAL_LINE AS NUMERIC(09))AS TN,'A'AS BUDGET,' 'AS LOCAL_CURR,' 'AS COUNT,0 AS COUNTS,CAST(' 'AS NCHAR(80))AS TNS,C.DESCR AS ACCOUNT_NAME,A.DESCRIPTN AS DESCRIPTION,A.CONV_CODE,A.TREFERENCE AS TRANS_REF,' 'AS MATCHED,C.ACNT_TYPE AS AT,' 'AS DOUBLES,' 'AS SPLIT,ADD_1=E.A,' 'AS ADD_2,' 'AS ADD_3,PAYMENT_ADD=' ' INTO LLPSY_PK1_BPS_INDEX_1    FROM PK1_A_SALFLDG AS A INNER JOIN PK1_ACNT AS C ON A.ACCNT_CODE=C.ACNT_CODE LEFT JOIN LLPSY_PK1_BNK_BKA_VIEW   AS E ON A.ACCNT_CODE=E.ACCOUNT AND E.A<>'M'  OR  A.ACCNT_CODE=E.ACCOUNT AND E.A= 'M'  AND A.ANAL_T9   =E.BDS       LEFT JOIN PK1_A_SALFLDG_LAD  AS M ON A.ACCNT_CODE=M.ACCNT_CODE AND A.JRNAL_NO=M.JRNAL_NO AND A.JRNAL_LINE=M.JRNAL_LINE WHERE(( A.ACCNT_CODE BETWEEN ? and ? AND C.ACNT_TYPE IN(1)))AND ALLOCATION NOT IN ('A','P','Y','C','R','2','W') UNION SELECT PAYMENT_REF=CASE C.ACNT_TYPE WHEN 1 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 0 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 2 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 4 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))END ,A.ACCNT_CODE AS ACCOUNT,BANKNO=CASE WHEN E.BANK_ACNT_NUM IS NULL THEN''ELSE E.BANK_ACNT_NUM END,AMOUNT=CASE WHEN A.AMOUNT>0 THEN A.AMOUNT ELSE A.AMOUNT*-1 END,A.D_C AS AMOUNT_DC,OTHER_AMOUNT=CASE WHEN A.OTHER_AMT>0 THEN A.OTHER_AMT ELSE A.OTHER_AMT*-1 END,A.D_C AS OTHER_AMOUNT_DC,CAST(A.ACCNT_CODE AS NCHAR(15))+CAST(A.PERIOD AS NCHAR(07))+CONVERT(CHAR(16),A.TRANS_DATETIME,112)AS LEDGER_KEY,CAST(A.JRNAL_NO AS NUMERIC(09))AS JN,CAST(A.JRNAL_LINE AS NUMERIC(09))AS TN,'B'AS BUDGET,' 'AS LOCAL_CURR,' 'AS COUNT,0 AS COUNTS,CAST(' 'AS NCHAR(80))AS TNS,C.DESCR AS ACCOUNT_NAME,A.DESCRIPTN AS DESCRIPTION,A.CONV_CODE,A.TREFERENCE AS TRANS_REF,' 'AS MATCHED,C.ACNT_TYPE AS AT,' 'AS DOUBLES,' 'AS SPLIT,ADD_1=E.A,' 'AS ADD_2,' 'AS ADD_3,PAYMENT_ADD=' '                               FROM PK1_B_SALFLDG AS A INNER JOIN PK1_ACNT AS C ON A.ACCNT_CODE=C.ACNT_CODE LEFT JOIN LLPSY_PK1_BNK_BKA_VIEW   AS E ON A.ACCNT_CODE=E.ACCOUNT AND E.A<>'M'  OR  A.ACCNT_CODE=E.ACCOUNT AND E.A= 'M'  AND A.ANAL_T9   =E.BDS       LEFT JOIN PK1_A_SALFLDG_LAD  AS M ON A.ACCNT_CODE=M.ACCNT_CODE AND A.JRNAL_NO=M.JRNAL_NO AND A.JRNAL_LINE=M.JRNAL_LINE WHERE(( A.ACCNT_CODE BETWEEN ? and ? AND C.ACNT_TYPE IN(1)))AND ALLOCATION NOT IN ('A','P','Y','C','R','2','W')SELECT PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY=IDENTITY(int,1,1),DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3,PAYMENT_ADD INTO LLPSY_PK1_BPS_INDEX_2     FROM LLPSY_PK1_BPS_INDEX_1   SELECT PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 INTO dbo.LLPSY_PK1_BPS_INDEX  FROM LLPSY_PK1_BPS_INDEX_2    WHERE ISNUMERIC(LTRIM(PAYMENT_REF))=1   SET IDENTITY_INSERT LLPSY_PK1_BPS_INDEX  ON  INSERT INTO LLPSY_PK1_BPS_INDEX  (PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3) SELECT dbo.LLPSY_Remove_AB_String(PAYMENT_REF), ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 FROM LLPSY_PK1_BPS_INDEX_2    WHERE dbo.LLPSY_Remove_AB_String(PAYMENT_REF)<>'' AND  dbo.LLPSY_Remove_AB_String(PAYMENT_REF)<>PAYMENT_REF
  SET IDENTITY_INSERT LLPSY_PK1_BPS_INDEX  ON  INSERT INTO LLPSY_PK1_BPS_INDEX  (PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3) SELECT dbo.LLPSY_Remove_AB_String(PAYMENT_ADD)AS PAYMENT_REF, ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 FROM LLPSY_PK1_BPS_INDEX_2    WHERE PAYMENT_ADD IS NOT NULL AND PAYMENT_ADD<>'' AND dbo.LLPSY_Remove_AB_String(PAYMENT_ADD)<>'' CREATE INDEX PAYMENT_REF_IND ON LLPSY_PK1_BPS_INDEX  (PAYMENT_REF)  CREATE INDEX BANKNO_IND ON LLPSY_PK1_BPS_INDEX  (BANKNO)  CREATE INDEX LEDGER_KEY_IND ON LLPSY_PK1_BPS_INDEX  (LEDGER_KEY)  CREATE INDEX JN_IND ON LLPSY_PK1_BPS_INDEX  (JN)  CREATE INDEX TN_IND ON LLPSY_PK1_BPS_INDEX  (TN)  CREATE NONCLUSTERED INDEX  REC_KEY_IND ON LLPSY_PK1_BPS_INDEX  ([REC_KEY]) 
DROP TABLE LLPSY_PK1_BPS_INDEX_1    
DROP TABLE LLPSY_PK1_BPS_INDEX_2     END

它以以下错误结尾:

  1. SQLCODE -156
  2. SQLSTATE 37000
  3. 关键字“ PROCEDURE”附近的语法不正确

当我在SQL Manager中运行此SQL时,它可以正常工作。 当我在SQL事件探查器中跟踪它时,我得到了:

declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N'@P1 nvarchar(1000),@P2 nvarchar(1000),@P3 nvarchar(1000),@P4 nvarchar(1000)',N'CREATE PROCEDURE dbo.LLPSY_PK1_BPS_PROC_INDEX  AS BEGIN 
 IF EXISTS (select * from sysobjects where id = object_id(N''LLPSY_PK1_BPS_INDEX '') and OBJECTPROPERTY(id, N''IsTable'') = 1) DROP TABLE LLPSY_PK1_BPS_INDEX 
 IF EXISTS (select * from sysobjects where id = object_id(N''LLPSY_PK1_BPS_INDEX_1    '') and OBJECTPROPERTY(id, N''IsTable'') = 1) DROP TABLE LLPSY_PK1_BPS_INDEX_1    
 IF EXISTS (select * from sysobjects where id = object_id(N''LLPSY_PK1_BPS_INDEX_2    '') and OBJECTPROPERTY(id, N''IsTable'') = 1) DROP TABLE LLPSY_PK1_BPS_INDEX_2    
SELECT PAYMENT_REF=CASE C.ACNT_TYPE WHEN 1 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 0 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 2 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 4 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))END ,A.ACCNT_CODE AS ACCOUNT,BANKNO=CASE WHEN E.BANK_ACNT_NUM IS NULL THEN''''ELSE E.BANK_ACNT_NUM END,AMOUNT=CASE WHEN A.AMOUNT>0 THEN A.AMOUNT ELSE A.AMOUNT*-1 END,A.D_C AS AMOUNT_DC,OTHER_AMOUNT=CASE WHEN A.OTHER_AMT>0 THEN A.OTHER_AMT ELSE A.OTHER_AMT*-1 END,A.D_C AS OTHER_AMOUNT_DC,CAST(A.ACCNT_CODE AS NCHAR(15))+CAST(A.PERIOD AS NCHAR(07))+CONVERT(CHAR(16),A.TRANS_DATETIME,112)AS LEDGER_KEY,CAST(A.JRNAL_NO AS NUMERIC(09))AS JN,CAST(A.JRNAL_LINE AS NUMERIC(09))AS TN,''A''AS BUDGET,'' ''AS LOCAL_CURR,'' ''AS COUNT,0 AS COUNTS,CAST('' ''AS NCHAR(80))AS TNS,C.DESCR AS ACCOUNT_NAME,A.DESCRIPTN AS DESCRIPTION,A.CONV_CODE,A.TREFERENCE AS TRANS_REF,'' ''AS MATCHED,C.ACNT_TYPE AS AT,'' ''AS DOUBLES,'' ''AS SPLIT,ADD_1=E.A,'' ''AS ADD_2,'' ''AS ADD_3,PAYMENT_ADD='' '' INTO LLPSY_PK1_BPS_INDEX_1    FROM PK1_A_SALFLDG AS A INNER JOIN PK1_ACNT AS C ON A.ACCNT_CODE=C.ACNT_CODE LEFT JOIN LLPSY_PK1_BNK_BKA_VIEW   AS E ON A.ACCNT_CODE=E.ACCOUNT AND E.A<>''M''  OR  A.ACCNT_CODE=E.ACCOUNT AND E.A= ''M''  AND A.ANAL_T9   =E.BDS       LEFT JOIN PK1_A_SALFLDG_LAD  AS M ON A.ACCNT_CODE=M.ACCNT_CODE AND A.JRNAL_NO=M.JRNAL_NO AND A.JRNAL_LINE=M.JRNAL_LINE WHERE(( A.ACCNT_CODE BETWEEN @P1 and @P2 AND C.ACNT_TYPE IN(1)))AND ALLOCATION NOT IN (''A'',''P'',''Y'',''C'',''R'',''2'',''W'') UNION SELECT PAYMENT_REF=CASE C.ACNT_TYPE WHEN 1 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 0 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 2 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))WHEN 4 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))END ,A.ACCNT_CODE AS ACCOUNT,BANKNO=CASE WHEN E.BANK_ACNT_NUM IS NULL THEN''''ELSE E.BANK_ACNT_NUM END,AMOUNT=CASE WHEN A.AMOUNT>0 THEN A.AMOUNT ELSE A.AMOUNT*-1 END,A.D_C AS AMOUNT_DC,OTHER_AMOUNT=CASE WHEN A.OTHER_AMT>0 THEN A.OTHER_AMT ELSE A.OTHER_AMT*-1 END,A.D_C AS OTHER_AMOUNT_DC,CAST(A.ACCNT_CODE AS NCHAR(15))+CAST(A.PERIOD AS NCHAR(07))+CONVERT(CHAR(16),A.TRANS_DATETIME,112)AS LEDGER_KEY,CAST(A.JRNAL_NO AS NUMERIC(09))AS JN,CAST(A.JRNAL_LINE AS NUMERIC(09))AS TN,''B''AS BUDGET,'' ''AS LOCAL_CURR,'' ''AS COUNT,0 AS COUNTS,CAST('' ''AS NCHAR(80))AS TNS,C.DESCR AS ACCOUNT_NAME,A.DESCRIPTN AS DESCRIPTION,A.CONV_CODE,A.TREFERENCE AS TRANS_REF,'' ''AS MATCHED,C.ACNT_TYPE AS AT,'' ''AS DOUBLES,'' ''AS SPLIT,ADD_1=E.A,'' ''AS ADD_2,'' ''AS ADD_3,PAYMENT_ADD='' ''                               FROM PK1_B_SALFLDG AS A INNER JOIN PK1_ACNT AS C ON A.ACCNT_CODE=C.ACNT_CODE LEFT JOIN LLPSY_PK1_BNK_BKA_VIEW   AS E ON A.ACCNT_CODE=E.ACCOUNT AND E.A<>''M''  OR  A.ACCNT_CODE=E.ACCOUNT AND E.A= ''M''  AND A.ANAL_T9   =E.BDS       LEFT JOIN PK1_A_SALFLDG_LAD  AS M ON A.ACCNT_CODE=M.ACCNT_CODE AND A.JRNAL_NO=M.JRNAL_NO AND A.JRNAL_LINE=M.JRNAL_LINE WHERE(( A.ACCNT_CODE BETWEEN @P3 and @P4 AND C.ACNT_TYPE IN(1)))AND ALLOCATION NOT IN (''A'',''P'',''Y'',''C'',''R'',''2'',''W'')SELECT PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY=IDENTITY(int,1,1),DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3,PAYMENT_ADD INTO LLPSY_PK1_BPS_INDEX_2     FROM LLPSY_PK1_BPS_INDEX_1   SELECT PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 INTO dbo.LLPSY_PK1_BPS_INDEX  FROM LLPSY_PK1_BPS_INDEX_2    WHERE ISNUMERIC(LTRIM(PAYMENT_REF))=1   SET IDENTITY_INSERT LLPSY_PK1_BPS_INDEX  ON  INSERT INTO LLPSY_PK1_BPS_INDEX  (PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3) SELECT dbo.LLPSY_Remove_AB_String(PAYMENT_REF), ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 FROM LLPSY_PK1_BPS_INDEX_2    WHERE dbo.LLPSY_Remove_AB_String(PAYMENT_REF)<>'''' AND  dbo.LLPSY_Remove_AB_String(PAYMENT_REF)<>PAYMENT_REF
  SET IDENTITY_INSERT LLPSY_PK1_BPS_INDEX  ON  INSERT INTO LLPSY_PK1_BPS_INDEX  (PAYMENT_REF,ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3) SELECT dbo.LLPSY_Remove_AB_String(PAYMENT_ADD)AS PAYMENT_REF, ACCOUNT,BANKNO,AMOUNT,AMOUNT_DC,OTHER_AMOUNT,OTHER_AMOUNT_DC,LEDGER_KEY,JN,TN,BUDGET,LOCAL_CURR,COUNT,COUNTS,TNS,ACCOUNT_NAME,DESCRIPTION,CONV_CODE,TRANS_REF,MATCHED,AT,REC_KEY,DOUBLES,SPLIT,ADD_1,ADD_2,ADD_3 FROM LLPSY_PK1_BPS_INDEX_2    WHERE PAYMENT_ADD IS NOT NULL AND PAYMENT_ADD<>'''' AND dbo.LLPSY_Remove_AB_String(PAYMENT_ADD)<>'''' CREATE INDEX PAYMENT_REF_IND ON LLPSY_PK1_BPS_INDEX  (PAYMENT_REF)  CREATE INDEX BANKNO_IND ON LLPSY_PK1_BPS_INDEX  (BANKNO)  CREATE INDEX LEDGER_KEY_IND ON LLPSY_PK1_BPS_INDEX  (LEDGER_KEY)  CREATE INDEX JN_IND ON LLPSY_PK1_BPS_INDEX  (JN)  CREATE INDEX TN_IND ON LLPSY_PK1_BPS_INDEX  (TN)  CREATE NONCLUSTERED INDEX  REC_KEY_IND ON LLPSY_PK1_BPS_INDEX  ([REC_KEY]) 
DROP TABLE LLPSY_PK1_BPS_INDEX_1    
DROP TABLE LLPSY_PK1_BPS_INDEX_2     END',1
select @p1

从SQL Profiler运行此代码会导致与嵌入式SQL中相同的错误。请问这是怎么了?

1 个答案:

答案 0 :(得分:0)

不是答案,但评论太久了。您有很多过于复杂的代码,而这些代码相对简单的更改将极大地受益。你有:

SELECT PAYMENT_REF=CASE C.ACNT_TYPE 
WHEN 1 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int), CAST(30 AS int)) AS NCHAR(30))
WHEN 0 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))
WHEN 2 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30))
WHEN 4 THEN  CAST(SUBSTRING(A.TREFERENCE,CAST(01 AS int),CAST(30 AS int)) AS NCHAR(30)) END ,
  • 您可以简单地将case表达式转换为所需的类型。您不需要强制每个条件。
  • 对于跟随您的任何人,请将您的布尔表达式放在顺序中。
  • 数字文字将隐式转换为适当的数据类型。像1和30这样​​的值将被解释为整数。无需投放它们。
  • 在每种情况下,您都使用相同的公式。那么,为什么您要通过写相同的东西4次来使事情变得过于复杂。
  • substring(1,30)与left(30)相同。再次,为什么会并发症?

因此,可以将这个公式简化并简化为:

select PAYMENT_REF = cast(case when C.ACNT_TYPE in (0, 1, 2, 4) 
    then left(A.TREFERENCE, 30) else NULL end as NCHAR(30)),

如果需要,可以省略ELSE部分。我之所以喜欢包含它,是因为它表明任何阅读代码的人实际上都在写作者所做的事情,然后考虑一下在评估期间不匹配时会发生什么。简单的格式可以使代码非常更易于阅读和理解。

最后,销毁和创建数据库中的永久表既是安全问题,也是效率问题。最好让合格的dba确定该表的位置,组织和索引,然后将其嵌入应用程序逻辑中。您没有考虑对这些表的权限-这也有重要意义。没有聚集索引AFAIK-这通常是一个问题。

看来,实现目标的更好方法是只创建一次存储过程。您使用两个(而不是现在令人困惑的四个)参数创建。您的dba将创建逻辑目标的单个表-其他两个表只是临时存储。粗略,不完整的伪代码:

create procedure dbo.LLPSY_PK1_BPS_PROC_INDEX (@ACCT_START int, @ACCT_END int) as 
begin 
    insert ... 
    select ... 
    where ( A.ACCNT_CODE BETWEEN @ACCT_START and @ACCT_END) ... 
    ...
end;

还有更多应解决的问题-但您必须从某个地方开始。使用UNION(不是UNION ALL),[select ... into ...]的多种用法,在特定时间点依赖于应用程序逻辑并特定于其的过程的构建-所有这些正在制造未来的调试和维护问题。最后一句话-您的代码对大多数语句采用特定的架构,但对其中一个非常重要的语句(创建过程语句)采用一种特定的架构。要么无处不在,要么无处可去。最好不要在没有充分理由的情况下完全假设。