0

我有以下问题:我有一个 SQL 表,它在一列中包含文本和数字。我创建了两个视图来处理文本和数字。

如果我选择整个视图,它们会按预期工作,但是如果我在 select 语句中添加 where 语句,则会收到以下错误:

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
4

2 回答 2

0

对视图 tst.tblInt 使用“case when”。

 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 
于 2012-12-05T12:07:20.997 回答
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
于 2012-12-05T12:10:04.303 回答