2

最終的に正常に機能するようになったクエリがありますが、本当に必要なのは、SQLPRINTコマンドを使用して表示される結果です。これは、結果を電子メールで自動化するためです。結果を印刷されたテキストとして出力できる場合は、ここで使用するツールを使用して結果を電子メールに埋め込むことができます。それ以外の場合は、現在の結果をファイルとして添付する必要があり、可能であれば印刷されたテキストをお勧めします。

追加してクエリを変更しようとしましたDECLAREPRINT、本当に混乱していて理解できません。クエリには、複数のデータベースからデータを取得する2つのCTEが含まれています。昨日のSAPシステムからのすべての販売番号/IDを選択し、それらを昨日のPOSシステムからの販売番号/ IDと比較して、POSシステムのすべての販売が現在SAPにあることを確認します。クエリ自体は正常に機能します。

このクエリの結果を印刷するにはどうすればよいですか?

WITH CTE1 (SAP_SALE)
AS
(          
  select distinct convert(BIGINT,convert(varchar(15),WERKS)+(select RIGHT(convert(Varchar(20),BONNR),7)))
  as Branch_tx_no from [PDP].[pdp].[S120] WITH (NOLOCK)
  where SPTAG >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  SPTAG < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
),
CTE2 (AR_SALE)
AS
(
  select convert(varchar(15),branch_no)+convert(varchar(15),sale_tx_no)
  from [ARDB01].[PP_BODATA].[DBO].[sales_tx_hdr] WITH (NOLOCK)
  WHERE sale_date >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  sale_date < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
  and sale_type in ('C','L')
)
SELECT AR_SALE FROM CTE2 AS CTE2
  Left OUTER JOIN CTE1 AS CTE1
  ON CTE1.SAP_SALE = CTE2.AR_SALE
WHERE CTE1.SAP_SALE IS NULL
ORDER BY CTE2.AR_SALE
4

3 に答える 3

3

最も簡単な解決策は、カーソルとPRINT1行を一度に使用することです。または、結果に特殊文字が含まれていない場合は、XML連結を使用できます。

DECLARE @txt NVARCHAR(MAX);


WITH CTE1 (SAP_SALE)
AS
(          
  select distinct convert(BIGINT,convert(varchar(15),WERKS)+(select RIGHT(convert(Varchar(20),BONNR),7)))
  as Branch_tx_no from [PDP].[pdp].[S120] WITH (NOLOCK)
  where SPTAG >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  SPTAG < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
),
CTE2 (AR_SALE)
AS
(
  select convert(varchar(15),branch_no)+convert(varchar(15),sale_tx_no)
  from [ARDB01].[PP_BODATA].[DBO].[sales_tx_hdr] WITH (NOLOCK)
  WHERE sale_date >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  sale_date < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
  and sale_type in ('C','L')
)
SELECT @txt = (
SELECT CHAR(13)+CHAR(10)+AR_SALE FROM CTE2 AS CTE2
  Left OUTER JOIN CTE1 AS CTE1
  ON CTE1.SAP_SALE = CTE2.AR_SALE
WHERE CTE1.SAP_SALE IS NULL
ORDER BY CTE2.AR_SALE
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)');

PRINT @txt;
于 2013-01-07T22:44:24.133 に答える
1

PRINTを使用する必要がある場合は、クエリの結果をコンマ(または他の文字)で区切られたVARCHAR変数に結合してから、その変数を出力できます。

DECLARE @sTMP varchar(1000)
SET @sTMP = ''

-- Your CTE....
SELECT @sTMP = @sTMP + AR_SALE + ',' FROM CTE2 AS CTE2
  Left OUTER JOIN CTE1 AS CTE1
  ON CTE1.SAP_SALE = CTE2.AR_SALE
WHERE CTE1.SAP_SALE IS NULL
ORDER BY CTE2.AR_SALE

PRINT @sTMP
于 2013-01-07T22:44:49.380 に答える
0
WITH CTE1 (SAP_SALE)
AS
(          
  select distinct convert(BIGINT,convert(varchar(15),WERKS)+(select RIGHT(convert(Varchar(20),BONNR),7)))
  as Branch_tx_no from [PDP].[pdp].[S120] WITH (NOLOCK)
  where SPTAG >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  SPTAG < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
),
CTE2 (AR_SALE)
AS
(
  select convert(varchar(15),branch_no)+convert(varchar(15),sale_tx_no)
  from [ARDB01].[PP_BODATA].[DBO].[sales_tx_hdr] WITH (NOLOCK)
  WHERE sale_date >= CAST(CONVERT(VARCHAR(10), GETDATE() -1, 101) AS DATETIME) AND
  sale_date < CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME)
  and sale_type in ('C','L')
)
SELECT AR_SALE, row_number() over (order by AR_SALE) as r
into #temp  -- added this row right here 
FROM CTE2 AS CTE2
  Left OUTER JOIN CTE1 AS CTE1
  ON CTE1.SAP_SALE = CTE2.AR_SALE
WHERE CTE1.SAP_SALE IS NULL
ORDER BY CTE2.AR_SALE

それから...

declare @x varchar(100) 
declare @i int 
    set @i = 1 

while (@i <= (select max(r) from #temp)) begin
    select @x=AR_SALE from #temp where r=@i
    print @x
    set @i=@i+1
end 
于 2013-01-07T22:46:29.593 に答える