我有以下代码在我的Sql(2008)存储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语句对同一个表....初始化它们中的每一个啊! !

关于如何在不对同一个表进行多次查询的情况下实现某些功能,有什么建议吗?


你不能选择..到. .表变量。最好的方法是先创建它,然后再插入它。你的第二个片段必须是

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 @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对所有人都可用。

你可以这样做:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

之后

SELECT CustomerId FROM #tempCustomer

你不需要声明#tempCustomer的结构

如果你想简单地分配一些变量以供以后使用,你可以通过以下方式一次性完成:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

如果这是你想要的东西的话

"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

这意味着创建一个新的@tempCustomer表变量并插入来自Customer的数据。你已经在上面声明过了,所以没有必要再声明。更好的选择是

INSERT INTO @tempCustomer SELECT * FROM Customer

我发现你的问题是在寻找同一个问题的解决方案;其他答案没有指出的是,在每次执行过程时使用变量以永久形式而不是临时形式更改表的名称。

到目前为止,我所做的是将整个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''
    ');

我希望它能有所帮助,但如果代码太大,它可能会很麻烦,所以如果你找到了更好的方法,请分享!