【问题标题】:How to return all of the result of a sql query or save it to a file instead如何返回 sql 查询的所有结果或将其保存到文件中
【发布时间】:2015-06-08 15:11:28
【问题描述】:

我有以下sql存储过程:

USE [FishTrackerProfessional]
GO
/****** Object:  StoredProcedure [dbo].[CreateErsSalesAddSubmission]    Script Date: 08/06/2015 15:57:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateErsSalesAddSubmission]

-- Add the parameters for the stored procedure here
@uname VARCHAR(10) ,
        @pword VARCHAR(10) ,
        @sntype VARCHAR(1) ,
        @action VARCHAR(10) ,
        @salesContractRef VARCHAR(10),

        @auctionId NCHAR(10) 

AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  -- Insert statements for procedure here
 SELECT
    RTRIM(@uname) AS '@uname',
    RTRIM(@pword) AS '@pword',

    (SELECT

        @snType AS '@snType',
        RTRIM(@action) AS '@action',
        COALESCE(@salesContractRef, '') AS '@salesContractRef',
        CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate',
        RTRIM(COALESCE(@auctionID, '')) AS '@auctionID',
        ISNULL(Logbook1 + ',', '') + ISNULL(Logbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums',
        ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums',
        COALESCE(VesselName, '') AS '@vesselName',
        RTRIM(VesselPLN) AS '@vesselPln',
        RTRIM(VesselOwner) AS '@vesselMasterOwner',
        COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1',
        COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2',
        COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3',
        RTRIM(CountryOfLanding) AS '@countryOfLanding',
        RTRIM(PortOfLanding) AS '@portOfLanding',
        (SELECT

            COALESCE(RTRIM(SpeciesCode),'') AS '@speciesCode',
            RTRIM(FishingArea) AS '@faoAreaCode',
            COALESCE(RTRIM(IcesZone),'') AS '@ZoneCode',
            COALESCE(RTRIM(ld.DisposalCode),'') AS '@disposalCode',
            COALESCE(ld.FreshnessGrade,'') AS '@freshnessCode',
            COALESCE(ld.ProductSize,'') AS '@sizeCode',
            COALESCE(ld.PresentationCode,'') AS '@presentationCode',
            COALESCE(ld.PresentationState,'') AS '@stateCode',
            RTRIM(ld.NumberOfFish) AS '@numberOfFish',
            FORMAT(ld.Quantity, 'N2') AS '@weightKgs',
            FORMAT(Quantity * ld.UnitPrice, 'N2') AS '@value',
            COALESCE(ld.Currency,'') AS '@currencyCode',
            RTRIM(ld.WithdrawnDestinationCode) AS '@withdrawnDestinationCode',
            RTRIM(ld.BuyersRegistrationCode) AS '@buyerReg',
            RTRIM(ld.SalesContractRef) AS '@salesContractRef'

        FROM LandingDetails ld
        JOIN LandingHeaders lh
            ON ld.LandingId = lh.LandingId
        WHERE ld.LandingId = lh1.LandingId
        FOR XML PATH ('salesline'), TYPE)



    FROM LandingHeaders lh1

    WHERE lh1.AllocatedErsId IS NULL AND lh1.LandingDate1 BETWEEN '2015-05-01' AND '2015-05-30'
    ORDER BY VesselName,lh1.LandingId

    FOR XML PATH ('salesnote'), TYPE)
FOR XML PATH ('ers')
END

当从 ssms 中运行时,它能够返回大量信息。但是,当此过程映射到我的 entitydata 模型中返回字符串类型标量的函数时,它返回的只是其中的一小部分。

我开始认为 ssms 已经被特别调整为使用 for xml 显示查询的结果,因此这对我来说将是一个潜在的问题,除非我可以做其他事情。

我知道我可以从 ssms 结果中保存这个 sproc 的结果,并将其全部保存到单个 xml 文件中。因此,是否有可能从存储过程中指示将结果保存到具有特定名称的文件(例如公共文档文件夹等公共位置),并且在运行过程时应该始终覆盖它。

谢谢

【问题讨论】:

标签: sql sql-server xml entity-framework-6


【解决方案1】:

这是可能的,但我不确定这是否真的是一个好主意。您的 SQL Server 用户帐户需要额外的权限才能写入磁盘,您需要管理和维护一种方法,以确保您不会无意中覆盖文件(SQL 编程并不是真正设计好的,比如说, .NET),并且您的过程的任何使用者都需要一些特殊知识(此过程在其他地方返回其结果集,这里是它在发生此故障或发生故障时返回的错误代码等)。

您最好确保正确使用您的程序。对于 EF,这个问题可能会有所帮助:Entity framework calling a FOR XML stored procedure truncates at 2033 characters

但请记住,其他一些(非 EntityFramework)客户端可能希望有一天使用该 SP - 以绕过此 EF 特定限制的方式重写它可能会使该消费者陷入困境,需要进一步的体操首先应该由 EF 客户端执行。或者,只需使用 ADO.NET 而不是 EF 调用该过程 - 在我看来,在这种情况下这样做可能比尝试解决一个奇怪的 EF 限制更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多