【问题标题】:I want to run multiple Select queries in one stored procedure我想在一个存储过程中运行多个 Select 查询
【发布时间】:2021-06-24 11:39:55
【问题描述】:

我想在我的存储过程中运行两个选择查询。目前它只运行一个选择查询,但我希望存储过程运行两个选择查询。我要运行的另一个查询是

Select companyUDIDDescription from companyudid where companyKey=@CompanyKey and isDeleted=0

上面的查询返回一个我想在每次执行这个存储过程时使用的列。

    CREATE OR ALTER PROCEDURE [dbo].[GetFilteredUsers]
    (
      @Sitekey   AS INT,
      @CompanyKey   AS INT,
      @FilterType AS SMALLINT,
      @FiterValue VARCHAR(25))
     AS
    BEGIN 
         SELECT userKey
         INTO #TempUsersTable
         FROM Vault..[User]
         WHERE IsDeleted=0 and siteKey=@Sitekey and companyKey=@CompanyKey
    -- ----------------------------------------------------------------Filter based on udid value------------------------------------------------------------------------
        IF(@FilterType) =1 --udid
        BEGIN
            SELECT AUX.userUDIDValue,
                   AUX.userKey,AUX.userLogin,AUX.userCreated,AUX.userFirstName,AUX.userLastName,AUX.userGender,
                   AUX.userBirthdate,AUX.Usertitle,AUX.cellphone,AUX.homephone,AUX.fax,
                   AUX.emergencycontact,AUX.useremail,AUX.emergencyContactRelation,AUX.emergencyPhoneNo1,AUX.emergencyPhoneNo2,
                   AUX.firstPassportName,AUX.firstPassportNo,AUX.firstPassportExpirationDate,
                   AUX.firstPassportIssuingCountry,AUX.redressNumber,AUX.redressNumber2,AUX.secondPassportExpirationDate, 
                   AUX.secondPassportIssuingCountry,AUX.secondPassportname,AUX.ApproverEmail,
                   AUX.originAirportCode, AUX.airSeatingName,AUX.airMealName,
                   AUX.hotelSmokingPreference,
                   AUX.hotelBedPreference,
                   AUX.carVehicleTypeKey,
                   AUX.addressLine1,AUX.addressLine2,AUX.countryCode,AUX.stateCode,AUX.zip ,Aux.city,Aux.groupName
              FROM ( SELECT (SELECT DISTINCT SUBSTRING(
                                (
                                SELECT '|'+ST1.userUDIDValue AS [text()]
                                FROM Vault.dbo.userudid ST1
                                WHERE ST1.userkey = ST2.userkey
                                ORDER BY ST1.userkey
                                FOR XML PATH ('')
                                ), 2, 1000) [Students]
                                FROM Vault.dbo.userudid ST2
                                WHERE ST2.userkey = T.userkey
                                ) AS userUDIDValue,
                           t.userKey,us.userLogin,us.userCreated,us.userFirstName,us.userLastName,us.userGender,us.userBirthdate,
                           p.Usertitle,p.cellphone,p.homephone,p.fax,
                           p.emergencycontact,p.useremail,p.emergencyContactRelation,p.emergencyPhoneNo1,p.emergencyPhoneNo2,p.firstPassportName,
                           p.firstPassportNo,p.firstPassportExpirationDate,
                           p.firstPassportIssuingCountry,p.redressNumber,p.redressNumber2,p.secondPassportExpirationDate, p.secondPassportIssuingCountry,
                           p.secondPassportname,p.ApproverEmail,a.originAirportCode,asl.airSeatingName,aml.airMealName,hsl.hotelSmokingPreference,
                           hbl.hotelBedPreference,c.carVehicleTypeKey,ad.addressLine1,ad.addressLine2,ad.city,ad.countryCode,ad.stateCode,ad.zip,g.groupName
                      FROM #TempUsersTable t 
                      INNER JOIN [user] us ON t.userkey = us.userkey  
                      INNER JOIN UserProfile p  ON t.userkey = p.userkey
                      LEFT OUTER JOIN AirPreference a  ON t.userkey = a.userkey
                      LEFT OUTER JOIN AirSeatingLookup asl ON a.airSeatingKey=asl.airSeatingKey
                      LEFT OUTER JOIN AirMealLookup aml ON a.airMealKey=aml.airMealKey
                      LEFT OUTER JOIN HotelPreference h  ON t.userkey = h.userkey AND h.hotelPreferenceKey = (SELECT MAX(hotelPreferenceKey) FROM HotelPreference WHERE userKey = t.userKey)
                      LEFT OUTER JOIN HotelSmokingLookup hsl ON h.hotelSmokingKey=hsl.hotelSmokingKey 
                      LEFT OUTER JOIN HotelBedLookup hbl ON h.hotelBedKey=hbl.hotelBedKey
                      LEFT OUTER JOIN CarPreference c  ON t.userkey = c.userkey
                      LEFT OUTER JOIN ADDRESS ad ON p.workAddressKey=ad.addressKey
                      LEFT OUTER JOIN [GroupMembers] gm ON us.userKey=gm.groupMemberTableKey
                      LEFT OUTER JOIN [Group] g ON gm.groupKey=g.groupKey
                   ) AUX
             WHERE AUX.userUDIDValue  LIKE '%'+@FiterValue+'%' -- UDid text 
        END

【问题讨论】:

  • 如果我在你的团队中看到了Select * from,我会建议你把特定的列都放在星号中
  • 哦,我把*放错了,修正了错误
  • 请注意,您的 @FiterValue 容易受到 sql 注入的影响,因此我希望它已被清理,而不是直接来自用户。

标签: sql sql-server stored-procedures


【解决方案1】:

你可以做这样的事情。 首先为第一个select语句结果声明一个变量(考虑列名是id)

declare @id int
set @id = (Select id from companyudid where companyKey=@CompanyKey and 
isDeleted=0)

--now you have @id which is the result of the first select statement. and you 
--can use it for the second one in the same procedure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 2012-04-16
    • 2021-08-18
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多