2017-04-18 22 views
0

私はSQL Server 2008 R2で作業しています。キーワードがSQL Serverで正しく機能していませんか?

次のクエリ:

select alloted_area 
from tbllogin 
where nid = 82 

戻り、この

alloted_area 
1,101,1002,79,365,297 

次のクエリ

select * 
from tblarea 
where nid in (1, 101, 1002, 79, 365, 297) 

戻り、この

nid  area_name 
------------------ 
1  RAJASTHAN 
101  RAJASTHAN 
79  RAJASTHAN 
297  RAJASTHAN 
365  RAJASTHAN 
1002 RAJASTHAN 

しかし、次のクエリ

select * 
from tblarea 
where nid in (select alloted_area from tbllogin where nid = 82) 

は、このエラーを生成します。

Conversion failed when converting the varchar value '1,101,1002,79,365,297' to data type int

私は何をすべき?

おそらく、コンマ記号に基づいてalloted_areasの行をtblloginにする必要があります。それ、どうやったら出来るの?

コメントで示唆したように、データをコンマ区切りの値として保存しないようにしましたが、それはその情報を格納するテーブル全体を作成することを意味します。私の状況で希望の結果を達成できる方法はありますか?

+6

データをコンマ区切りted値。それはあなたに多くのトラブルを引き起こすだけです! – jarlh

+3

'IN'が正しく動作しています。あなたがやっていることは 'nid = cast('101,1002,79,365,297 'int)'と同じですが、もちろん動作しません。 –

答えて

1

これはここ

DECLARE @a VARCHAR(max) = (select alloted_area from tbllogin where nid = 82) 
select * from tblarea where nid in (select sID from splitstring(@values,',')) 
-1

nIdはint型です。 alloted_areaはvarchar型のようです。クロスチェック。

2

これを試してみてください:

DECLARE @values NVARCHAR(100) = (select alloted_area from tbllogin where nid = 82) 
DECLARE @sqlQuery NVARCHAR(200) = ' select * from tblarea where nid in ('+ @values +') ' 
EXEC (@sqlQuery) 

はそれがお役に立てば幸いです。 :)

+0

このエラーを返すストアドプロシージャ 'select * from tblarea where nid in(1,101,1002,79,365,297)'が見つかりませんでした。 – rexroxm

+0

'EXEC @ sqlQuery'を変数のまわりで大括弧で囲むように変更します:' EXEC(@sqlQuery) ' – BeanFrog

+0

そう、beanfrogは真です。すみません、私は父親を忘れました。 :) –

-1

これは、int型がサブSELECT文で正しく宣言されていない可能性があります。これはcast()メソッドがうまく動作する場所です。

試してみてください。cInt(alloted_area) AS alloted_area_int

select * from tblarea where nid in (select cInt(alloted_area) AS alloted_area_int from tbllogin where nid=82)

1

に動作しますが、変数を介さずに2種類の方法です: SplitStringは、SQLServerの2016の新機能であるので、私は含まsqlserver 2008のStringSplitを実装するメソッド。

第1の方法がある限り、テーブルtblloginにNIDとして動作しますが一意である:

SELECT 
    * 
FROM 
    tblarea 
WHERE 
    nid in 
    (
     SELECT Value 
     FROM 
     [SplitString]((SELECT alloted_area FROM tbllogin WHERE nid = 82),',') 
    ) 

第二の方法は、テーブルtblloginにNIDときの状況を処理することができるユニークではありません。

SELECT 
    * 
FROM 
    tblarea 
WHERE 
    nid in 
    (
    SELECT x.value 
    FROM tbllogin 
    CROSS APPLY 
     [SplitString](alloted_area,',')x 
    WHERE nid = 82 
) 

あなたはこの関数を使用してsqlserver 2008でStringSplitを模倣することができます。

CREATE FUNCTION [dbo].[SplitString] 
(
    @List NVARCHAR(MAX), 
    @Delim VARCHAR(255) 
) 
RETURNS TABLE 
AS 
    RETURN ( 
     SELECT 
      [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number], 
      CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number]))) 
     FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name) 
      FROM sys.all_objects) AS x 
      WHERE Number <= LEN(@List) 
      AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim 
    ); 
関連する問題