簡體   English   中英

SQL Server存儲過程中的SELECT列AS @ParameterName

[英]SELECT Column AS @ParameterName in SQL Server stored procedure

我有一個存儲過程,我需要將列別名作為參數傳遞,我該如何進行這項工作?

這是存儲過程的代碼,給我帶來麻煩:

ManufacturerPriceListQty.Price As @PriceLevelAlias

這是存儲過程:

ALTER PROCEDURE [dbo].[Export_Products]
    @PriceLevelAlias AS VARCHAR(25),
    @PriceListCodes AS VARCHAR(250) --Exmaple: 'Des', 'Designer', 'Non-Stocking', 'NonStocking'
AS
BEGIN
    SET NOCOUNT ON;
    --PRINT @PriceListCodes
    --SELECT * FROM dbo.Split(@PriceListCodes,',')
    -- Insert statements for procedure here

    SELECT  
        CAST(p.ManufacturerID as varchar(2))+'-'+p.ProductNumber  AS ItemID,
        SUBSTRING(p.ProductName,0,100) as ItemName,
        p.ProductName AS [Description],
        ManufacturerPriceListQty.Price As @PriceLevelAlias,
        ManufacturerPriceListQty.Qty as OnHandQuantity,
        ManufacturerPriceListQty.MultipleQty as OrderMinimumQuantity,
        ManufacturerPriceListQty.MultipleQty as OrderMultipleQuantity,
        Manufacturer.CompanyName AS CatalogName,
        Manufacturer.CompanyName AS CatalogCode,
        p.ProductNumber as UDF1,
        CAST(p.ManufacturerID as varchar(2)) AS UDF2,
        '%'+CAST(p.ProductID as varchar(10)) as UDF5,
        CASE 
           WHEN P.Active ='1' THEN 'FALSE'  
           ELSE 'TRUE'  
        END AS IsDeleted,
        @PriceLevelAlias AS PriceLevel,
        ManufacturerPriceList.PriceListCode,
        ManufacturerPriceListProduct.PriceListID
    FROM         
        ManufacturerPriceListProduct
    INNER JOIN
        ManufacturerPriceList ON ManufacturerPriceListProduct.PriceListID = ManufacturerPriceList.PriceListID 
    INNER JOIN
        Manufacturer ON ManufacturerPriceList.ManufacturerID = Manufacturer.ManufacturerID 
    INNER JOIN
        ManufacturerPriceListQty ON ManufacturerPriceListProduct.PriceListProductID = ManufacturerPriceListQty.PriceListProductID 
    INNER JOIN
        Product p ON ManufacturerPriceListProduct.ProductID = p.ProductID
    WHERE     
        (Manufacturer.Active = 1)
        AND p.Discontinued = 0
        AND PriceListCode IN (SELECT * FROM dbo.Split(@PriceListCodes, ',')) 
END

代替直接腳本,請嘗試使用最終的select語句作為查詢字符串。 請嘗試以下方法:

ALTER PROCEDURE [dbo].[Export_Products]
    @PriceLevelAlias AS VARCHAR(25),
    @PriceListCodes AS VARCHAR(250) --Exmaple: 'Des', 'Designer', 'Non-Stocking', 'NonStocking'
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    --PRINT @PriceListCodes
    --SELECT * FROM dbo.Split(@PriceListCodes,',')
        -- Insert statements for procedure here
    DECLARE @v_Qry VARCHAR(MAX)

    SELECT
        @v_Qry = '
                SELECT  
                CAST(p.ManufacturerID as varchar(2))+''-''+p.ProductNumber  AS ItemID
                ,SUBSTRING(p.ProductName,0,100) as ItemName
                ,p.ProductName AS [Description]
                ,ManufacturerPriceListQty.Price As '+@PriceLevelAlias+'
                ,ManufacturerPriceListQty.Qty as OnHandQuantity
                ,ManufacturerPriceListQty.MultipleQty as OrderMinimumQuantity
                ,ManufacturerPriceListQty.MultipleQty as OrderMultipleQuantity
                ,Manufacturer.CompanyName AS CatalogName
                ,Manufacturer.CompanyName AS CatalogCode
                ,p.ProductNumber as UDF1
                ,CAST(p.ManufacturerID as varchar(2)) AS UDF2
                ,''%''+CAST(p.ProductID as varchar(10)) as UDF5
                ,CASE 
                    WHEN P.Active =''1'' THEN ''FALSE'' 
                    ELSE ''TRUE'' 
                END AS IsDeleted
                ,@PriceLevelAlias AS PriceLevel
                ,ManufacturerPriceList.PriceListCode
                ,ManufacturerPriceListProduct.PriceListID
                FROM         ManufacturerPriceListProduct INNER JOIN
                                      ManufacturerPriceList ON ManufacturerPriceListProduct.PriceListID = ManufacturerPriceList.PriceListID INNER JOIN
                                      Manufacturer ON ManufacturerPriceList.ManufacturerID = Manufacturer.ManufacturerID INNER JOIN
                                      ManufacturerPriceListQty ON ManufacturerPriceListProduct.PriceListProductID = ManufacturerPriceListQty.PriceListProductID INNER JOIN
                                      Product p ON ManufacturerPriceListProduct.ProductID = p.ProductID
                WHERE     (Manufacturer.Active = 1)
                AND p.Discontinued=0
                AND PriceListCode 
                IN(SELECT * FROM dbo.Split(@PriceListCodes,'',''))'


    EXEC(@v_Qry)

END

無法動態設置列的別名。 實現此目的的唯一方法是動態創建完整語句(已經有一個答案)。

在一組封閉的可能值中,您可以使用帶有IF的結構以所有可能的組合定義語句。

如果您擁有一組封閉的值並且調用代碼知道使用哪個列名,則以下內容可能會對您有所幫助。

當SP返回結果集時,可能在所有可能的名稱中包含相同的值。 看這個例子

SELECT *
      ,type_desc AS Name1 
      ,type_desc AS Name2 
      ,type_desc AS Name3
      --add all possible types here
FROM sys.objects

調用后您將使用哪一列,然后由調用代碼決定...

在字符串之外還需要另外兩個變量:

`ALTER PROCEDURE [dbo]。[Export_Products] @PriceLevelAlias AS VARCHAR(25),@PriceListCodes AS VARCHAR(250)-示例:'Des','Designer','Non-stocking','NonStocking'開始-添加了SET NOCOUNT ON以防止多余的結果集干擾SELECT語句。 開啟NOCOUNT; --PRINT @PriceListCodes --SELECT * FROM dbo.Split(@PriceListCodes,',')-在此處插入過程的聲明DECLARE @v_Qry VARCHAR(MAX)

SELECT
    @v_Qry = '
            SELECT  
            CAST(p.ManufacturerID as varchar(2))+''-''+p.ProductNumber  AS ItemID
            ,SUBSTRING(p.ProductName,0,100) as ItemName
            ,p.ProductName AS [Description]
            ,ManufacturerPriceListQty.Price As '+@PriceLevelAlias+'
            ,ManufacturerPriceListQty.Qty as OnHandQuantity
            ,ManufacturerPriceListQty.MultipleQty as OrderMinimumQuantity
            ,ManufacturerPriceListQty.MultipleQty as OrderMultipleQuantity
            ,Manufacturer.CompanyName AS CatalogName
            ,Manufacturer.CompanyName AS CatalogCode
            ,p.ProductNumber as UDF1
            ,CAST(p.ManufacturerID as varchar(2)) AS UDF2
            ,''%''+CAST(p.ProductID as varchar(10)) as UDF5
            ,CASE 
                WHEN P.Active =''1'' THEN ''FALSE'' 
                ELSE ''TRUE'' 
            END AS IsDeleted
            ,''' + @PriceLevelAlias + ''' AS PriceLevel
            ,ManufacturerPriceList.PriceListCode
            ,ManufacturerPriceListProduct.PriceListID
            FROM         ManufacturerPriceListProduct INNER JOIN
                                  ManufacturerPriceList ON ManufacturerPriceListProduct.PriceListID = ManufacturerPriceList.PriceListID INNER JOIN
                                  Manufacturer ON ManufacturerPriceList.ManufacturerID = Manufacturer.ManufacturerID INNER JOIN
                                  ManufacturerPriceListQty ON ManufacturerPriceListProduct.PriceListProductID = ManufacturerPriceListQty.PriceListProductID INNER JOIN
                                  Product p ON ManufacturerPriceListProduct.ProductID = p.ProductID
            WHERE     (Manufacturer.Active = 1)
            AND p.Discontinued=0
            AND PriceListCode 
            IN(SELECT * FROM dbo.Split(''' + @PriceListCodes + ''','',''))'


EXEC(@v_Qry)

結束`

暫無
暫無

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

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