![](/img/trans.png)
[英]How can I insert a list returned from pyodbc mssql query into mysql through stored procedure using pymysql
[英]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.