0

任意の値のリストがあり、T-SQL を使用して複数のテーブルのレコードを削除したいと考えています。今後、さまざまな値のリストを使用してスクリプトを再利用したいと考えています。これはデバッグのみを目的としているため (新しいバージョンのソフトウェアで再インポートできるようにレコードを消去したいだけです)、きれいである必要はありません。

これまでのところ、私は持っています:

DECLARE @RequestIDList table(Request_ID nvarchar(50) NOT NULL)
INSERT INTO @RequestIDList (Request_ID) VALUES 
('00987172'), 
('01013218'), 
('01027886'), 
('01029552'), 
('01031476'), 
('01032882'), 
('01033085'), 
('01034446'), 
('01039261')
DELETE FROM Request WHERE Request_ID IN (SELECT Request_ID FROM @RequestIDList)
DELETE FROM RequestTest WHERE Request_ID IN (SELECT Request_ID FROM @RequestIDList)

うまくいくようですが、もっと良い方法はありますか?IN 句で変数を直接使用する方法がわかりません (例: "WHERE Request_ID IN @RequestIDList")。

4

2 に答える 2

2

クイック スクリプト:

SET NOCOUNT ON

-- Temp table so it can be joined against in dynamic SQL
IF OBJECT_ID('tempdb..#RequestIDList') IS NOT NULL 
  DROP TABLE #RequestIDList
GO

CREATE TABLE #RequestIDList (Request_ID nvarchar(50) NOT NULL)
INSERT INTO #RequestIDList (Request_ID) VALUES 
('00987172'),('01013218'),('01027886'),('01029552'), 
('01031476'),('01032882'),('01033085'),('01034446'), 
('01039261')

DECLARE @TableList TABLE (TableName NVARCHAR(128) NOT NULL) 
INSERT @TableList VALUES 
('Request'),
('RequestTest')

DECLARE 
  @sqlcmd VARCHAR(4000),
  @table  VARCHAR(128)

-- Loop through the tables in your delete list
DECLARE c CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
SELECT TableName
FROM @TableList
ORDER BY TableName

OPEN c 
FETCH NEXT FROM c INTO @table
WHILE @@FETCH_STATUS = 0 
BEGIN 

  -- Assuming all tables in schema dbo
  -- Assuming all tables have column Request_ID
  SET @sqlcmd = 'DELETE FROM t FROM ' + QUOTENAME(@table) 
              + ' t JOIN #RequestIDList r ON r.Request_ID = t.Request_ID'

  -- PRINT @sqlcmd
  EXEC (@sqlcmd) 
  FETCH NEXT FROM c INTO @table
END

CLOSE c 
DEALLOCATE c

-- Clean up
DROP TABLE #RequestIDList
于 2012-07-27T03:38:49.543 に答える
1

まず、入力を解析する関数を作成する必要があります

CREATE FUNCTION inputParser (@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
DECLARE @pos        int,
   @nextpos    int,
   @valuelen   int

SELECT @pos = 0, @nextpos = 1

WHILE @nextpos > 0
BEGIN
SELECT @nextpos = charindex(',', @list, @pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0
                      THEN @nextpos
                      ELSE len(@list) + 1
                 END - @pos - 1
INSERT @tbl (number)
  VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
SELECT @pos = @nextpos
END
RETURN
END

次に、SPでその関数を使用します

CREATE PROCEDURE usp_delete
@RequestIDList varchar(50) 
AS
Begin
 DELETE FROM Request as req inner join 
 inputParser (@RequestIDList) i on req.Request_ID = i.number
End

EXEC usp_delete '1, 2, 3, 4'

詳細については、この記事をご覧ください。SQL サーバーのバージョンに応じてさまざまな方法が説明されています。SQl サーバー 2008 では、入力パーサーをさらに簡素化する TVP を使用します。

于 2012-07-27T03:08:59.740 に答える