2012-12-05 3 views
0

다음과 같은 문제가 있습니다. 하나의 열에 텍스트와 숫자가 포함 된 SQL 테이블이 있습니다. 텍스트와 숫자를 처리하기 위해 두 가지보기를 만들었습니다. 나는 전체의 뷰를 선택하면 예상대로T-SQL 뷰 문 순서 순서

, 그들은 작동하지만 내가 선택 문에 어디 문을 추가 할 경우, 나는 다음과 같은 오류 얻을 :

Conversion failed when converting the varchar value 'Thomas' to data type int.

는 어떻게 든 서버를 말할 수를 내부 뷰의 where 문을 외부 선택 전에 적용할까요?

오류를 재생 다음 SQL 코드를 사용하십시오 :

create schema tst 
go 
create table tst.tbl(strValue varchar(10)) 
insert tst.tbl(strValue) 
    values ('Thomas'), ('1991'), ('Reto'), ('21'), ('Strub') 
go 
create view tst.tblStr as 
    select strValue 
    from tst.tbl 
    where isnumeric(strValue)=0 
go 
create view tst.tblInt as 
    select cast(strValue as int) intValue 
    from tst.tbl 
    where isnumeric(strValue)=1 

go 

select * from tst.tblStr order by strValue --ok 
select * from tst.tblInt order by intValue --ok 

go 

select * from tst.tblInt where intValue<100 --not ok 

go 

select * from tst.tbl where isnumeric(strValue)=1 and cast(strValue as int) < 100 --ok 

go 

drop view tst.tblInt 
drop view tst.tblStr 
drop table tst.tbl 
drop schema tst 
+0

귀하의 오류 메시지를 확인하십시오 한 줄을 modfied 제안 (데이터 유형 int.'에 VARCHAR 값 '토마스'를 변환 할 때 '변환 실패) 'Thomas'는'tst.tblInt'에 있습니다. 어떻게 그런 일이 일어 났습니까? – Kaf

+0

그게 아니야 ... 그냥 방금 잘못된 순서로 조항을 적용 ... – StrubT

답변

0

이보기 tst.tblInt에 대해 "때 경우"를 사용합니다.

create view tst.tblInt as 
    select 
      case when isnumeric(strValue)=1 
       then cast(strValue as int) 
       else 0 
      end intValue 

    from tst.tbl 
    where isnumeric(strValue)=1 
+0

위대한! 감사. 나는 당신의 대답을 3 분 안에 받아 들일 것입니다 .... – StrubT

0

가 당신이 이미 게시 대답 보라, 단지

CREATE SCHEMA TST 
GO 
CREATE TABLE TST.TBL(STRVALUE VARCHAR(10)) 
INSERT TST.TBL(STRVALUE) 
VALUES ('THOMAS'), ('1991'), ('RETO'), ('21'),('24'),('212'), ('STRUB') 
GO 
CREATE VIEW TST.TBLSTR AS 
SELECT STRVALUE 
FROM TST.TBL 
WHERE ISNUMERIC(STRVALUE)=0 
GO 
CREATE VIEW TST.TBLINT AS 
SELECT CAST(STRVALUE AS INT) INTVALUE 
FROM TST.TBL 
WHERE ISNUMERIC(STRVALUE)=1 

GO 

SELECT * FROM TST.TBLSTR ORDER BY STRVALUE --OK 
SELECT * FROM TST.TBLINT ORDER BY INTVALUE --OK 

GO 

**SELECT * FROM TST.TBLINT WHERE ISNUMERIC(INTVALUE)<100 --NOW OK ;)** 

GO 

SELECT * FROM TST.TBL WHERE ISNUMERIC(STRVALUE)=1 AND CAST(STRVALUE AS INT) < 100 --OK 

GO 

DROP VIEW TST.TBLINT 
DROP VIEW TST.TBLSTR 
DROP TABLE TST.TBL 
DROP SCHEMA TST 
+0

이것은 조건이 어떤 순서로 실행될 수 있는지에 대해서 여전히 틀릴 수 있습니다. http://stackoverflow.com/questions/13678718/execute-a-where-clause-before-another-one/13678854#13678854 –

+0

흠 ... 웃는 얼굴로 인해 이것은 심각한 대답이 아닌 것 같습니다. – StrubT

+0

윙크 similey는 그런 의미가 아니었지만, 여전히 선택 (* INTVALUE) = 1 및 ISNUMERIC (INTVALUE) <100은 작동 할 것이므로 그 문장이 어디에 있더라도 문제가되지 않습니다. 다중 라인. – Pratik