2014-02-03 5 views
0
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 в City Table - bigint. Когда CityId остается null, он дает ошибку, говоря «Ошибка преобразования типа данных varchar в bigint. 'SELECT Города в хранимой процедуре

Примечание: Если я построю следующий запрос, все будет выглядеть нормально.

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

, но если я продолжу со следующим запросом, это даст ошибку.

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

Я предполагаю, что в этом случае я должен строить массив int, но я не знаю, как это сделать. Любые предложения?

ответ

3

Вы можете использовать динамический SQL

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

Попробуйте это:

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

SELECT * 
FROM City 
WHERE charindex(',' + CAST(CityID as nvarchar(20)) + ',', @CityId) > 0 
0

хранимой процедуры

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'); 
1
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 ('[email protected]+')  
    ';   


SELECT @SQL = @SQL + N' ';   


EXEC Sp_executeSQL   
    @SQL 
Смежные вопросы