1

これが私が達成しようとしていることの例です。

declare @MenuIDs varchar(max) = '1,2,3,4';

SELECT 
    tMenuMain.MenuId, 
    tMenuMain.MenuRank 
INTO #TempRankTable 
FROM tMenuMain 
WHERE tMenuMain.MenuId IN (@MenuIDs);

select * from  #TempRankTable;                      

@MenuIDs変数は、実際にはsprocパラメーターです。(説明のために例で宣言したばかりです)

INコマンドは文字列だけでなくコンマ区切りの値でのみ機能するため、selectを機能させるにはどうすればよいですか。私が直面している他の問題は、tMenuMain.MenuIdが整数列であるということです。この状況でCASTを実行することは可能ですか?

4

3 に答える 3

2

文字列をテーブルに「マップ」する小さなヘルパー関数を宣言できます。

CREATE FUNCTION dbo.str2ints(@str nvarchar(max))
RETURNS @ints TABLE (val INT)
AS
BEGIN
  DECLARE @xml XML
  SET @xml = '<root><str>' + REPLACE(@str, ',', '</str><str>') + '</str></root>'
  INSERT INTO @ints(val)
  SELECT str.value('.', 'int') 
  FROM @xml.nodes('//str') AS RECORDS(str)
  RETURN
END

次に、分割にその関数を使用するように関数を書き直すことができます。

declare @MenuIDs varchar(max) = '1,2,3,4';

SELECT 
    tMenuMain.MenuId, 
    tMenuMain.MenuRank 
INTO #TempRankTable 
FROM tMenuMain 
WHERE tMenuMain.MenuId IN (SELECT * FROM dbo.str2ints(@MenuIDs));

select * from  #TempRankTable;   
于 2012-09-15T17:14:28.583 に答える
1

動的 SQL とビューを使用する必要があります。

declare @MenuIDs varchar(max) = '1,2,3,4';
declare @SQL varchar(max);

set @SQL = 'create view vTab as
            SELECT tMenuMain.MenuId, tMenuMain.MenuRank                 
            FROM tMenuMain 
            WHERE tMenuMain.MenuId IN ('+@MenuIDs+')';
/*
   Select in @SQL should look like:
            create view vTab as
            SELECT tMenuMain.MenuId, tMenuMain.MenuRank                 
            FROM tMenuMain 
            WHERE tMenuMain.MenuId IN (1,2,3,4)
*/

exec(@SQL)

select * 
into #TempRankTable 
from vTab 

drop view vTab   

select * from  #TempRankTable; 

create tableまたは挿入する前にできれば

 declare @MenuIDs varchar(max) = '1,2,3,4';
 declare @SQL varchar(max);

 create table #TempRankTable 
 (
   MenuId ...
   MenuRank ...
 ) 

set @SQL = 'insert into #TempRankTable(MenuId,MenuRank) 
            SELECT tMenuMain.MenuId, tMenuMain.MenuRank                 
            FROM tMenuMain 
            WHERE tMenuMain.MenuId IN ('+@MenuIDs+')';
/*
   Select in @SQL should look like:
            insert into #TempRankTable(MenuId,MenuRank) 
            SELECT tMenuMain.MenuId, tMenuMain.MenuRank                 
            FROM tMenuMain 
            WHERE tMenuMain.MenuId IN (1,2,3,4)
*/

exec(@SQL)

select * from  #TempRankTable; 
于 2012-09-15T16:41:58.953 に答える
0

あなたがやりたいことをする簡単でクリーンな方法があります。次の質問には、たとえばXMLや値を分割するローカル関数を使用した多くの回避策が含まれています。

醜いが簡単な代替手段は、CHARINDEXメソッドを使用して、',' + tMenuMain.MenuId + ','がに含まれているかどうかを確認することです,1,2,3,4,(開始コンマと末尾コンマに注意してください)。

于 2012-09-15T16:46:26.517 に答える