将动态SQL转换为静态SQL

时间:2012-07-24 13:16:52

标签: sql sql-server database tsql stored-procedures

任何人都可以帮我解决这个Dynamic queryStatic one

DECLARE @REPCD VARCHAR(10)
SET @REPCD='CA%'

IF (CHARINDEX('*',@REPCD,1)>0 OR  CHARINDEX('%',@REPCD,1)>0) 
BEGIN
    SET @WHERE = ' AND REP_CD like ''' + REPLACE(@REPCD, '''', '') + ''''
END
ELSE
BEGIN
    SET @WHERE = ' AND REP_CD = ''' + REPLACE(@REPCD, '''', '') + ''''
END

我想将上述查询转换为类似

的内容
SELECT * FROM REP
WHERE CASE WHEN CHARINDEX('%',@REPCD,1)>0 THEN REP_CD like 'CA%' END AS REP_CD

3 个答案:

答案 0 :(得分:2)

为什么这不起作用?

...
WHERE REP_CD LIKE REPLACE(@REPCD, '*', '%');

如果@REPCD不包含通配符,LIKE就像=一样。因此,根本没有理由CASE或任何其他条件逻辑变体。

如果没有动态SQL,目前无法使LIKE / =可互换。好吧,我想有这种复杂的方式(假设REP_CD不能为NULL),但我没有任何线索为什么这比我上面发布的更好。

SET @REPCD = REPLACE(@REPCD, '*', '%');

...
WHERE REP_CD LIKE CASE WHEN CHARINDEX('%', @REPCD) > 0 THEN @REPCD ELSE REP_CD END
AND REP_CD = CASE WHEN CHARINDEX('%', @REPCD) > 0 THEN REP_CD ELSE @REPCD END

答案 1 :(得分:0)

select * 
from Rep
where Rep_CD like replace(@repcd, '*','%')

答案 2 :(得分:0)

试试这个

DECLARE @REPCD VARCHAR(10)
SET @REPCD='CA'
set @REPCD=REPLACE(@REPCD,'*','%')
SELECT * FROM REP where REP_CD like @REPCD