1. 程式人生 > >sql儲存過程,語句拼接,使用遊標

sql儲存過程,語句拼接,使用遊標

DECLARE @paramNameCh  NVARCHAR(50)
DECLARE    @paramFoid  NVARCHAR(50)


SET @paramNameCh = '張三,李四,'
SET @paramFoid = '441112197702157913,140107205632126715,'

DECLARE @sql VARCHAR(8000) --臨時存放sql語句
DECLARE    @sqlWhere  NVARCHAR(500)
DECLARE    @sqlWhereNameCh  NVARCHAR(500)
DECLARE    @sqlWhereFoid  NVARCHAR(500)

    -- Insert statements for procedure here
    
    IF (@paramNameCh IS NULL)    
        BEGIN
            SET @paramNameCh=''
        END
    
    IF (@paramFoid IS NULL)
        BEGIN
            SET @paramFoid=''
        END
    
    IF (Charindex(',', @paramNameCh)>0)
        BEGIN
            SET  @sqlWhereNameCh = ''
            SET  @sqlWhereFoid = ''
            
            
            --解析
            SET @paramFoid = REPLACE(@paramFoid, ',', ',')
            SET @paramFoid = 'NI'
[email protected]

            SET @paramFoid = REPLACE(@paramFoid, ',', ',NI')
            DECLARE @foid VARCHAR(50)         
            DECLARE cursor1 CURSOR
                FOR
                --傳入引數
                SELECT F1 FROM f_splitstr(@paramFoid,',')
            OPEN cursor1        
            FETCH NEXT FROM cursor1 INTO @foid
            WHILE ( @@fetch_status = 0 )                   
                BEGIN
                    IF (@sqlWhereFoid<>'')
                        BEGIN
                            SET @sqlWhereFoid = @sqlWhereFoid + ' or '
                        END
                    SET @sqlWhereFoid = @sqlWhereFoid + ' Charindex('''
[email protected]
+''', table.dbo.TA_PSRBASICINFO.PSR_FOID_NONET)>0 '                                     
                    FETCH NEXT FROM cursor1 INTO @foid
                END                                 
            --關閉遊標
            CLOSE cursor1   
            --釋放遊標     
            DEALLOCATE cursor1
            SET @sqlWhereFoid = ' And (' + @sqlWhereFoid + ') '
            
                     
            --解析
            SET @paramNameCh = REPLACE(@paramNameCh, ',', ',')
            DECLARE @name VARCHAR(50)         
            DECLARE cursor1 CURSOR
                FOR
                --傳入引數
                SELECT F1 FROM f_splitstr(@paramNameCh,',')
            OPEN cursor1        
            FETCH NEXT FROM cursor1 INTO @name
            WHILE ( @@fetch_status = 0 )              
                BEGIN
                    IF (@sqlWhereNameCh<>'')
                        BEGIN
                            SET @sqlWhereNameCh = @sqlWhereNameCh + ' or '
                        END
                    SET @sqlWhereNameCh = @sqlWhereNameCh + ' Charindex('''
                        + @name
                        + ''', table.dbo.TA_PSRBASICINFO.PSR_CHNNAME)>0 '                     
                    FETCH NEXT FROM cursor1 INTO @name
                END                                 
            --關閉遊標
            CLOSE cursor1   
            --釋放遊標     
            DEALLOCATE cursor1
            
            SET @sqlWhereNameCh = ' And (' + @sqlWhereNameCh + ') '
            
            SET @sqlWhere = @sqlWhereNameCh + ' ' + @sqlWhereFoid
        END
    ELSE
        BEGIN
            SET @sqlWhere ='AND table.dbo.TA_PSRBASICINFO.PSR_CHNNAME LIKE  ''%'
[email protected]
+'%''  AND table.dbo.TA_PSRBASICINFO.PSR_FOID_NONET LIKE  ''%'[email protected]+'%'' '
        END

 
SET @sql ='    SELECT  n.FLT_DATE ,
        n.FNO ,
        n.PSR_NAME ,
        n.PSR_CHNNAME ,
        n.PSR_FOID_NONET ,
        Airport_1.AirPt_Chn_NM ,
        Airport_2.AirPt_Chn_NM ,
        CASE WHEN n.PSR_STATUS=''AC'' THEN ''已完成'' ELSE ''未完成'' END AS PSR_STATUS
        FROM    ( SELECT    table.dbo.FDC_FLIGHTINFO.FLT_DATE ,
                    table.dbo.FDC_FLIGHTINFO.FLT_AIRLINE
                    + table.dbo.FDC_FLIGHTINFO.FLT_NUMBER AS FNO ,
                    table.dbo.TA_PSRBASICINFO.PSR_NAME ,
                    table.dbo.TA_PSRBASICINFO.PSR_CHNNAME ,
                    table.dbo.TA_PSRBASICINFO.PSR_FOID_NONET ,
                    FDC_STATION_1.STA_STACODE AS dep ,
                    FDC_STATION_2.STA_STACODE AS arr,
                    table.dbo.TA_PSRBASICINFO.PSR_STATUS
          FROM      table.dbo.FDC_FLIGHTINFO
                    INNER JOIN table.dbo.TA_PSRBASICINFO ON table.dbo.FDC_FLIGHTINFO.FLT_DOWNLOADID = table.dbo.TA_PSRBASICINFO.SEG_FLTID
                    INNER JOIN table.dbo.FDC_STATION FDC_STATION_1 ON table.dbo.FDC_FLIGHTINFO.FLT_FDCID = FDC_STATION_1.STA_FLTID
                                                              AND table.dbo.TA_PSRBASICINFO.SEG_DEPTNO = FDC_STATION_1.STA_STAINDEX
                    INNER JOIN table.dbo.FDC_STATION FDC_STATION_2 ON FDC_STATION_1.STA_FLTID = FDC_STATION_2.STA_FLTID
                                                              AND table.dbo.TA_PSRBASICINFO.SEG_DESTNO = FDC_STATION_2.STA_STAINDEX
          WHERE ( table.dbo.TA_PSRBASICINFO.PSR_STATUS = ''AC'' ) ' + @sqlWhere + '
        ) AS n
        INNER JOIN psbtable.dbo.Airport AS Airport_1 ON Airport_1.AirPt_Iata_Cd = n.dep
        INNER JOIN psbtable.dbo.Airport AS Airport_2 ON Airport_2.AirPt_Iata_Cd = n.arr '

   
EXEC (@sql)

相關推薦

sql儲存過程語句拼接使用遊標

DECLARE @paramNameCh  NVARCHAR(50) DECLARE    @paramFoid  NVARCHAR(50) SET @paramNameCh = '張三,李四,' SET @paramFoid = '441112197702157913,1

儲存過程中動態拼接sql拼接單引號問題

create or replace procedure mergerOrder(       v_ids in varchar2,       v_productCode in varchar2,       v_productCateCode in varchar2)

SQL儲存過程函式

儲存過程和函式的區別: 儲存過程可以沒有返回值,函式必須有返回值; // 語法 CREATE PROCEDURE 儲存過程名(引數列表) BEGIN 儲存過程體; END 引數模式 IN , OUT

工作總結24 Windows的任務計劃定時執行oracle儲存過程語句

1、在pl/sql中,建立一個儲存過程 create or replace procedure pro as begin    /***業務程式***/   commit; end pro; 2、在某

oracle的儲存過程寫法以及呼叫各種遊標的介紹(靜態動態sys遊標的區別)

1、plsql下執行不帶引數的儲存過程      CALL  getDeptCount(); 2、plsql下執行帶引數的儲存過程DECLARE,必須使用程式碼段,並且可以列印其中的輸出引數 salary varchar2(100); BEGIN getSalaryByE

SQL儲存過程呼叫標量值函式儲存過程呼叫儲存過程

一、存 儲過程呼叫標量值函式 先建一個標量值函式,如 CREATE FUNCTION [dbo].[F_Num] ( @a nvarchar(50) ) RETURNS nvarchar(50) AS BEGIN declare @m nvarchar(50) selec

sql server建立儲存過程(有參無參有輸出)

student表已經有了,“建立”在中間,測試在最下面! select * from student; sid sname sex age tel s001 豐登兒 男 35 13527542451 s002 班克爾

SQL儲存過程 (時間段迴圈事務)

USE [SSIS_ExtractData] GO /****** Object: StoredProcedure [dbo].[sp_AntifakeAnalysis] Script Date: 05/05/2017 16:01:52 ******/ SET ANS

mysql 常用命令語句規範及日誌儲存

1.mysql常用命令 SELECT VERSION(); 顯示當前版本 SELECT NOW();顯示當前日期時間 SELECT USER(); 顯示當前使用者 2.mysql語句規範 1.關鍵字與函式名全部大寫 2.資料庫名稱,表名稱,欄位名稱等全部小寫 3

SQL儲存過程分頁與遊標使用

儲存過程: CREATE procedure p_splitpage    @sql nvarchar(4000), --要執行的sql語句  @page int=1,    --要顯示的頁碼 @pageSize int,&n

Oracle 儲存過程中傳送郵件並支援使用者驗證 中文標題和內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

ASP.NET MVC + EF 利用儲存過程讀取大資料1億資料測試很OK

 看到本文的標題,相信你會忍不住進來看看!   沒錯,本文要講的就是這個重量級的東西,這個不僅僅支援單表查詢,更能支援連線查詢,   加入一個表10W資料,另一個表也是10萬資料,當你用linq建立一個連線查詢然後

呼叫儲存過程一次後程式崩潰 (臨時表和表變數)

編寫了一個顯示資料的儲存過程,前臺視窗首次呼叫顯示資料正常,退出再次進入該視窗是程式崩潰   原因是:不要使用臨時表#temp,最好使用表變數@temp 我的簡單理解即使你在儲存過程中刪除了臨時表,但是也會導致程式出錯   下面深刻認識一下臨時表和表變數吧

【Oracle】PL/SQL 儲存過程 顯式遊標、隱式遊標、動態遊標

  【Oracle】PL/SQL 顯式遊標、隱式遊標、動態遊標 2013年06月17日 09:02:51 AlphaWang 閱讀數:13009更多 個人分類: 【Database】 在PL/SQL塊中執行SELECT、INSERT、DELET

oracle儲存過程傳入in引數返回結果集

create or replace procedure proc_report_TEST(zhxshss in varchar2, pcursor out sys_refcursor) as begi

儲存過程中的outoutputreturn 的使用

output 型別的引數需要在儲存過程的引數列表中新增。output型別的引數傳入儲存過程後還會返回其執行後的值。return value型別的引數不需要在儲存過程的引數列表中新增。return value型別的引數就是儲存過程最後return的值。 資料庫中使用out

mysql中的儲存過程之無引數in、out、inout引數的講解

首先建立三個測試表: 如下: user表裡邊的欄位為userId,userName 使用者表 dept表裡邊的欄位為deptId,deptName部門表 other表裡邊的欄位為otherId,otherName 其他表 建立無引數儲存 create procedure 你

MVC呼叫儲存過程實現分頁帶查詢條件

alter procedure P_GetPagedUserInfoByCondition @PageSize int,--表示每頁要顯示的記錄數 @CurrentPageIndex int,--表示當前要顯示第幾頁的資料 @RecordCount int output,--表示滿足條

儲存過程執行很慢請求優化

SELECT TD.CourseID,TU.StudentUserID,COUNT(EU.ExerciseSubjectID) AS SubmitCouont     ,COUNT(ES.ExerciseSubjectID)-COUNT(EU.ExerciseSubjectI

Oracle儲存過程物件(packageprocedure etc...) 呼叫許可權 ----20180206

在一些技術論壇裡面,常常看到有朋友問這種問題: 為什麼我的使用者具有DBA許可權,卻無法在儲存過程裡面建立一張普通表呢?  下面就結合具體案例來談談這個問題:  SQL> conn eric/eric; Connected.SQL> select * from dba_role_privs whe