簡體   English   中英

在存儲過程中選擇城市

[英]SELECT Cities in stored procedure

DECLARE @CityId AS VARCHAR(20) = NULL
DECLARE @CityList AS VARCHAR(20) = '1, 2, 3, 4, 5';

IF (@CityId IS NULL)
    SET @CityId = @CityList;

SELECT *
FROM City
WHERE CityID IN (@CityId)

我有一個列出所有城市的存儲過程。 但是,如果設置了參數,則它應僅顯示有關該城市的特定信息。 “城市表”中的CityID為bigint。 當CityId保留為空時,它會顯示錯誤消息' 將數據類型varchar轉換為bigint時出錯。

注意:如果我構造以下查詢,則一切似乎正常。

SELECT * FROM City WHERE CityID IN (1, 2, 3, 4, 5)

但是,如果我繼續以下查詢,則會出現錯誤。

SELECT * FROM City WHERE CityID IN ('1, 2, 3, 4, 5')

我想在這種情況下我應該構造一個int數組,但是我不知道該怎么做。 有什么建議么?

您可以使用動態SQL

exec('SELECT * FROM City WHERE CityID IN (' + @CityId + ')')

嘗試這個:

IF (@CityId IS NULL)
    SET @CityId = ',' + REPLACE(@CityList, ' ', '') + ','; 
ELSE
    SET @CityId = ',' + @CityId + ',';

SELECT * 
FROM City 
WHERE charindex(',' + CAST(CityID as nvarchar(20)) + ',', @CityId) > 0
DECLARE @CityId AS VARCHAR(20) = NULL
DECLARE @CityList AS VARCHAR(20) = '1, 2, 3, 4, 5';

IF (@CityId IS NULL)
    SET @CityId = @CityList;

DECLARE @SQL NVARCHAR(MAX);        

 SET @SQL = N'        
 SELECT *
FROM City
 where  
  1 = 1  
  AND Cityid in ('+@CityId+')    
  ';        


 SELECT @SQL = @SQL + N' ';        


 EXEC Sp_executeSQL         
   @SQL

儲存程序

DELIMITER $$
DROP PROCEDURE IF EXISTS `mystoredprocedure`$$
CREATE PROCEDURE `mystoredprocedure`(IN city_id AS VARCHAR(20))
BEGIN
SET @CityId = city_id; 
SET @where_condition = "";
IF (@CityId IS NULL)  THEN 
SET @where_condition  = CONCAT(@where_condition,"1, 2, 3, 4, 5"); 
ELSE
SET @where_condition  = @CityId;
END IF;
SET @query = CONCAT("SELECT * FROM City WHERE CityID IN (",@where_condition,")");
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

通話聲明

CALL `mystoredprocedure`(NULL);

要么

CALL `mystoredprocedure`('1,2,3');

暫無
暫無

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

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