私のSql(2008)Stored Procsには、以下のコードがあります。
CREATE PROCEDURE [dbo].[Item_AddItem]
@CustomerId uniqueidentifier,
@Description nvarchar(100),
@Type int,
@Username nvarchar(100),
AS
BEGIN
DECLARE @TopRelatedItemId uniqueidentifier;
SET @TopRelatedItemId =
(
SELECT top(1) RelatedItemId
FROM RelatedItems
WHERE CustomerId = @CustomerId
)
DECLARE @TempItem TABLE
(
ItemId uniqueidentifier,
CustomerId uniqueidentifier,
Description nvarchar(100),
Type int,
Username nvarchar(100),
TimeStamp datetime
);
INSERT INTO Item
OUTPUT INSERTED.* INTO @TempItem
SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()
SELECT
ItemId,
CustomerId,
@TopRelatedItemId,
Description,
Type,
Username,
TimeStamp
FROM
@TempItem
END
GO
それで、皆さんへの質問は以下の行に沿って何かをする可能性があるということです -
DECLARE @TempCustomer TABLE
(
CustomerId uniqueidentifier,
FirstName nvarchar(100),
LastName nvarchar(100),
Email nvarchar(100)
);
SELECT
CustomerId,
FirstName,
LastName,
Email
INTO
@TempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId
それで、私が他の次のステートメントでメモリからこのデータを再利用できるように? SQL Serverは上記のステートメントと一致するが、私は別々の変数を作成し、同じテーブルに対して別々のSELECTステートメントを介してそれらのそれぞれを初期化する必要はありません。
同じテーブルに対して複数のクエリを実行せずに、行に沿って何かを達成する方法について何か提案はありますか?
あなたはテーブル変数を選択することはできません。あなたができる最善の方法は、まずそれを作成してからそれに挿入することです。あなたの2番目のスニペットは
DECLARE @TempCustomer TABLE
(
CustomerId uniqueidentifier,
FirstName nvarchar(100),
LastName nvarchar(100),
Email nvarchar(100)
);
INSERT INTO
@TempCustomer
SELECT
CustomerId,
FirstName,
LastName,
Email
FROM
Customer
WHERE
CustomerId = @CustomerId
後で使用するために単純にいくつかの変数を割り当てたい場合は、以下の行に沿って何かを使ってそれらをワンショットで行うことができます。
declare @var1 int,@var2 int,@var3 int;
select
@var1 = field1,
@var2 = field2,
@var3 = field3
from
table
where
condition
それがあなたが後にしていることのタイプであるならば
あなたはこれを行うことができます:
SELECT
CustomerId,
FirstName,
LastName,
Email
INTO #tempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId
じゃあ後で
SELECT CustomerId FROM #tempCustomer
#tempCustomerの構造を宣言する必要はありません。
構文が少し外れているようです。これにはいくつかあります 良い例
DECLARE @TempCustomer TABLE
(
CustomerId uniqueidentifier,
FirstName nvarchar(100),
LastName nvarchar(100),
Email nvarchar(100)
);
INSERT @TempCustomer
SELECT
CustomerId,
FirstName,
LastName,
Email
FROM
Customer
WHERE
CustomerId = @CustomerId
じゃあ後で
SELECT CustomerId FROM @TempCustomer
あなたは一時テーブルが欲しいようですね。 http://www.sqlteam.com/article/temporary-tables
#TempTableはSP全体で利用可能です。
## TempTableはすべての人に利用可能です。
私はあなたの質問が同じ問題に対する解決策を探しているのを見つけました。そして他の答えが指摘していないのは、一時的ではなく永久的な形式であなたの手続きの実行毎に変数を使ってテーブルの名前を変更する方法です。
これまでは、SQLコード全体を使用する変数と連結していました。このような:
declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name
EXEC('
SELECT var1, var2, var3
INTO '+@table_name+'
FROM my_view
WHERE string = ''Strings must use double apostrophe''
');
私はそれが役立つことを願っていますが、コードが大きすぎると厄介になるかもしれません。