簡體   English   中英

pytds調用的MSSQL存儲過程返回的記錄過多

[英]Too many records returned from MSSQL stored procedure called by pytds

我在MSSQL數據庫中有一個存儲過程,如下所示:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[VideoSearchThorough]
(
  @SearchString NVARCHAR(4000) = ''
  , @Offset INT = 0
  , @Limit INT = 100
  , @UserId INT = 0
  , @ProviderId INT = NULL
  , @StatusType INT = 0
  , @StartDate datetime = NULL
  , @EndDate datetime = NULL
  , @UseUpdatedDate bit = 0
  , @PltValue INT = NULL
)
AS
BEGIN
    DECLARE @OrderClause VARCHAR(200) = 'CreatedDate DESC'

    IF @Limit IS NULL OR @Limit > 100 SET @Limit = 100

    CREATE TABLE #tmpsrch(
      VideoId BIGINT,
      UserId INT,
      VideoUrl VARCHAR(500),
      Title VARCHAR(1000),
      Description VARCHAR(5000),
      CreatedDate datetime,
      EffectiveDate datetime,
      ExpirationDate datetime,
      Height INT,
      Width INT,
      Duration decimal(10, 2),
      ThumbnailUrl VARCHAR(200),
      Keywords VARCHAR(200),
      IsEnabled bit,
      IsDeleted bit,
      ProviderId INT,
      ProviderName VARCHAR(200),
      ProviderLogo VARCHAR(200),
      ProviderTrackingGroup INT,
      ProviderIsMediaSource bit,
      ProviderContentIsPrivate bit
    )

    INSERT INTO #tmpsrch(VideoId, UserId, VideoUrl, Title, Description, CreatedDate, EffectiveDate, ExpirationDate, Height, Width, Duration, ThumbnailUrl, Keywords, IsEnabled, IsDeleted, ProviderId, ProviderName, ProviderLogo, ProviderTrackingGroup, ProviderIsMediaSource, ProviderContentIsPrivate)
    EXEC VideoSearch @SearchString=@SearchString, @MatchType=0

    IF (SELECT COUNT(*) FROM #tmpsrch (NOLOCK)) = 0
    INSERT INTO #tmpsrch(VideoId, UserId, VideoUrl, Title, Description, CreatedDate, EffectiveDate, ExpirationDate, Height, Width, Duration, ThumbnailUrl, Keywords, IsEnabled, IsDeleted, ProviderId, ProviderName, ProviderLogo, ProviderTrackingGroup, ProviderIsMediaSource, ProviderContentIsPrivate)
    EXEC VideoSearch @SearchString=@SearchString, @MatchType=1

    IF (SELECT COUNT(*) FROM #tmpsrch (NOLOCK)) = 0
    INSERT INTO #tmpsrch(VideoId, UserId, VideoUrl, Title, Description, CreatedDate, EffectiveDate, ExpirationDate, Height, Width, Duration, ThumbnailUrl, Keywords, IsEnabled, IsDeleted, ProviderId, ProviderName, ProviderLogo, ProviderTrackingGroup, ProviderIsMediaSource, ProviderContentIsPrivate)
    EXEC VideoSearch @SearchString=@SearchString, @MatchType=2

    SELECT TOP (@Limit) *, (SELECT COUNT(*) FROM #tmpsrch (NOLOCK)) AS ResultsAvailable FROM (
        SELECT
            ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) AS rowId,
            *
        FROM #tmpsrch
    ) AS results
    WHERE results.rowId > @Offset

    DROP TABLE #tmpsrch
END

GO

在我的python 3代碼中,我通過pytds模塊調用了此存儲過程:

with pytds.connect(db_server, db_name, db_user, db_pass) as connection, connection.cursor() as cursor:
    cursor.callproc('VideoSearchThorough', ['search string', 0, 20])
    response = cursor.fetchall()
    result = []
    for rowData in response:
        row = {}
        for columnIndex, columnData in enumerate(cursor.description):
            row[columnData[0]] = rowData[columnIndex]
        result.append(row)

    return result # This contains 84 result records

但是,當我在SQL Operations Studio客戶端中執行以下SQL時:

VideoSearchThorough 'search string', 0, 20

..僅返回20條記錄。 我只需要20條記錄,因為我要傳遞20作為限制(提供給VideoSearchThorough存儲過程的第三個參數)。

但是,在Python 3.7中使用pytds模塊時,總共返回了84條記錄,為什么會有區別呢?

我在您的Python代碼中看不到您在設置@Limit變量的地方:如果您未設置該變量,那么它將使用默認值100,但是只有87條記錄要返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM