2013-03-14 45 views
0

我有一个表名为Test如何在将值传入SQL Server 2008中的表后获取一行?

Test 
Name Value1(varchar) Value2(varchar) 
A   1     9 
B   10     19 
C   20     39 
D   40     45 
...  ...    ... 

现在我如何才能从测试表名称,当我发送类似“8”或“21'etc

+0

“8”或“21”在你的上下文中意味着什么,即预期的结果是什么? – Vikdor 2013-03-14 01:32:20

+0

感谢您的快速回复。传递数字是字符串,所以在我的情况下,如果我通过8,那么我应该得到A,如果我通过21,那么我应该得到C. – Lakhae 2013-03-14 01:36:15

回答

4

庵值,为什么你列VARCHAR

DECLARE @n INT = 8; 

SELECT Name FROM dbo.Test 
    WHERE @n BETWEEN CONVERT(INT, Value1) AND CONVERT(INT, Value2); 

如果您有这些列其他垃圾,你可能不得不做这样的事情,以防止SQL Server智胜你并试图'ascfdgt'转换为整数:

DECLARE @n INT = 8; 

SELECT Name FROM dbo.Test 
    WHERE ISNUMERIC(Value1) = 1 
    AND ISNUMERIC(Value2) = 1 
    AND @n BETWEEN CASE WHEN ISNUMERIC(Value1) = 1 THEN CONVERT(INT, Value1) END 
       AND CASE WHEN ISNUMERIC(Value2) = 1 THEN CONVERT(INT, Value2) END; 

现在请,无论是修复此列的数据类型,或将这些数字存储在不同的列中。

如果您在A12通过,并需要找到行,其中Value1A010Value2A029那么它就会稍微复杂一些:

DECLARE @n VARCHAR(12) = 'A12'; 

SELECT Name FROM dbo.Test 
    WHERE ISNUMERIC(SUBSTRING(Value1, 2, 255)) = 1 
    AND ISNUMERIC(SUBSTRING(Value2, 2, 255)) = 1 
    AND CONVERT(INT, SUBSTRING(@n, 2, 255)) 
     BETWEEN CASE WHEN ISNUMERIC(SUBSTRING(Value1, 2, 255)) = 1 
     THEN CONVERT(INT, SUBSTRING(Value1, 2, 255)) END 
      AND CASE WHEN ISNUMERIC(SUBSTRING(Value2, 2, 255)) = 1 
     THEN CONVERT(INT, SUBSTRING(Value2, 2, 255)) END; 

见该是多么难看?你可以请,请考虑修复这个可怕的设计,所以你不必乱扔你的代码库像这样的意大利面条问题?

+0

谢谢亚伦,你很棒。实际上列是主键,它也使用字母数字字符。让我再问你一件事,如果'value1'有A010,'value2'有A029并且传递值如A12 – Lakhae 2013-03-14 02:09:37

+0

@Lakhae,我该如何获得名称。我建议你修复这个模式。如果“A”和数字是两个独立的数据段,则将“A”存储在一列中,将数字存储在其他列中。 – 2013-03-14 02:33:36

+0

问题是我无法修复架构我需要一些解决方法。 – Lakhae 2013-03-14 02:37:27

相关问题