Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server选择进入@variable?_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

SQL Server选择进入@variable?

SQL Server选择进入@variable?,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我的一个Sql 2008存储过程中有以下代码,执行得非常好: CREATE PROCEDURE [dbo].[Item_AddItem] @CustomerId uniqueidentifier, @Description nvarchar(100), @Type int, @Username nvarchar(100), AS BEGIN DECLARE @TopRelatedItemId

我的一个Sql 2008存储过程中有以下代码,执行得非常好:

    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
所以,你们的问题是,有没有可能按照以下思路做点什么:


这样我就可以在下面的语句中重用内存中的数据了?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

看起来你的语法有点错误。这有一些

后来

SELECT CustomerId FROM @TempCustomer

听起来你想要临时表。

请注意,整个SP中都提供了诱惑功能

请注意,所有人都可以使用诱惑功能。

您可以执行以下操作:

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 tablevariable并从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''
    ');

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

诱惑-在所有者创建者删除它或断开连接之前,我不想要临时表。临时桌既昂贵又慢。我只想在一小段时间内为特定记录保留一点数据,并使其可用于多个sql语句,而无需后续查找。由于表变量的作用域在存储过程中定义,因此它们是存储一个存储过程调用的元组数据的完美解决方案…我还忘了提到数据库驻留在Azure中。。。。我不想给临时表的管理带来混乱。变量表是一种方法。声明@varTable Table…。创建单独的变量并通过单独的SELECT语句初始化每个变量-为什么需要这样做?声明@t table一次,如果需要重用它,则在再次插入@t table之前触发DELETE@TempCustomer。请注意,这在CTE上下文中也可以正常工作。巴辛加!有人能回答为什么不能像使用实际的临时表那样选择表变量吗?@webturner这两点都不正确。临时表的作用域不在proc之外,表变量的内存也不比临时表多。当不再需要临时表时,不要忘记添加一个DROP table TEMPCUSTER,否则下一次选择将导致TEMPCUSTER已存在错误最佳答案imho,但是如果结果不止一个会发生什么呢?如果结果不止一个,您将得到一个可用值。这可能会成为一个有趣的谜题!请参见强制查询返回单行的步骤使用SELECT TOP1@Adrian是的,上面的查询假设您选择了一行。如果您想要更奇特的逻辑,还可以使用排序和聚合函数。如果您不使用OP使用的数据库类型,则并非所有函数都支持Adrian提到的TOP 1。SQL Server/MS Access使用TOP,MySQL使用LIMIT,Oracle使用ROWNUM。有关详细信息,请参阅。它不起作用。您仍然需要事先声明表变量。由于来自dbforums的重定向,该“好例子”链接已转换为广告。是否有更好的链接满足您的要求?
INSERT INTO @tempCustomer SELECT * FROM Customer
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''
    ');