我如何解决视图中的 SQL 转换错误
HOW DO I SOLVE SQL CONVERSION ERROR IN VIEWS
我在 SQL 视图中有这个小错误:
SELECT CASE
WHEN CustomerID > 1 THEN CustomerPIN
WHEN SupplierID > 1 THEN SupplierPIN
END AS FullNames
CustomerPIN 和 SupplierPIN 是 table
中的 varchar 字段
当结果为 null、空或字母时一切都很好,但是当我选择一个有效的数字 PIN 时,returns将 varchar 值“123”转换为 int 时转换失败
PIN 可以包含字符串所有文字文本 'P002' 或所有数字文本 '0023' 或 'P_001',但无论哪种情况都是 varchar 数据类型。它
我缺少什么来完成这个?我想我应该以某种方式包装结果但猜不出来!
我看了这个,但似乎还是看不懂...SQL Conversion Error in view
谢谢。
我认为@HoneyBadger 走在正确的轨道上,尽管我无法重现错误。您应该告诉我们您如何在下游使用此结果,并尝试查明出现错误的确切行。
就您向我们展示的内容而言,您的代码确实有效,我可以按照您描述的格式生成一些假数据,并且 CASE 可以正常运行。我会在下面 post 它,也许你可以玩一下它看看你是否可以在这个可移植的例子中重现你的错误?
with cteData as ( --Set up sample data to test
SELECT * FROM (VALUES
(CONVERT(INT, 123) --Force cast into the desired data types, replace the types with yours!
, CONVERT(varchar(50), 'C123'), CONVERT(INT, 456), CONVERT(varchar(50), 'S456'))
--Begin the "real" data to test
, (100, '100', NULL, '400'), (120, '', NULL, NULL)
, (NULL, 'CNull', 457, 'S457'), (124, 'C124', NULL, 'SNULL')
, (NULL, '120', 400, '401') , (103, '133', NULL, NULL)
, (130, 'C130', 0, '')
) tblSample(CustomerID, CustomerPIN, SupplierID, SupplierPIN)
), cteTestCase as(
SELECT * ,
CASE
WHEN CustomerID > 1 THEN CustomerPIN
WHEN SupplierID > 1 THEN SupplierPIN
END AS FullNames
FROM cteData
)
SELECT *
FROM cteTestCase as T
--Play with a WHERE clause to try to reproduce your error and refine it!
--WHERE FullNames = '100'
由于 Robert Sheahan 和其他人的回答,我让它以这种方式工作:
SELECT CASE
WHEN CustomerID > 1 THEN Convert(VarChar(50), CustomerPIN)
WHEN SupplierID > 1 THEN Convert(VarChar(50), SupplierPIN)
END AS FullNames
看起来必须强制转换,不管 CustomerPIN 和 SupplierPIN 是 varchar 数据类型。
谢谢
我在 SQL 视图中有这个小错误:
SELECT CASE
WHEN CustomerID > 1 THEN CustomerPIN
WHEN SupplierID > 1 THEN SupplierPIN
END AS FullNames
CustomerPIN 和 SupplierPIN 是 table
中的 varchar 字段当结果为 null、空或字母时一切都很好,但是当我选择一个有效的数字 PIN 时,returns将 varchar 值“123”转换为 int 时转换失败
PIN 可以包含字符串所有文字文本 'P002' 或所有数字文本 '0023' 或 'P_001',但无论哪种情况都是 varchar 数据类型。它
我缺少什么来完成这个?我想我应该以某种方式包装结果但猜不出来!
我看了这个,但似乎还是看不懂...SQL Conversion Error in view
谢谢。
我认为@HoneyBadger 走在正确的轨道上,尽管我无法重现错误。您应该告诉我们您如何在下游使用此结果,并尝试查明出现错误的确切行。
就您向我们展示的内容而言,您的代码确实有效,我可以按照您描述的格式生成一些假数据,并且 CASE 可以正常运行。我会在下面 post 它,也许你可以玩一下它看看你是否可以在这个可移植的例子中重现你的错误?
with cteData as ( --Set up sample data to test
SELECT * FROM (VALUES
(CONVERT(INT, 123) --Force cast into the desired data types, replace the types with yours!
, CONVERT(varchar(50), 'C123'), CONVERT(INT, 456), CONVERT(varchar(50), 'S456'))
--Begin the "real" data to test
, (100, '100', NULL, '400'), (120, '', NULL, NULL)
, (NULL, 'CNull', 457, 'S457'), (124, 'C124', NULL, 'SNULL')
, (NULL, '120', 400, '401') , (103, '133', NULL, NULL)
, (130, 'C130', 0, '')
) tblSample(CustomerID, CustomerPIN, SupplierID, SupplierPIN)
), cteTestCase as(
SELECT * ,
CASE
WHEN CustomerID > 1 THEN CustomerPIN
WHEN SupplierID > 1 THEN SupplierPIN
END AS FullNames
FROM cteData
)
SELECT *
FROM cteTestCase as T
--Play with a WHERE clause to try to reproduce your error and refine it!
--WHERE FullNames = '100'
由于 Robert Sheahan 和其他人的回答,我让它以这种方式工作:
SELECT CASE
WHEN CustomerID > 1 THEN Convert(VarChar(50), CustomerPIN)
WHEN SupplierID > 1 THEN Convert(VarChar(50), SupplierPIN)
END AS FullNames
看起来必须强制转换,不管 CustomerPIN 和 SupplierPIN 是 varchar 数据类型。
谢谢