【问题标题】:SET value SELECT FROM variable tableSET 值 SELECT FROM 变量表
【发布时间】:2021-07-17 14:27:02
【问题描述】:

我需要使用变量表从SELECT 获取值。

我的代码如下所示:

SET @count = @count + 1;
SET @count = CAST (@count AS varchar)

IF @pocet> 0 AND @pocet <= 9

BEGIN
    SET @tab_val_ = 'tabVal_00' + @count;
    SET @tabSta _ = 'tabSta_00' + @count;
    SET @var1 = (SELECT DESC_POINT FROM @tabSta_ WHERE id_w = @ id_w);
    print @ var1;

错误 消息 1087,第 16 层,状态 1,第 54 行 必须声明表变量“@tabSta_”。


对不起,我想我说话了。

@tabSta_xxx 是一个实际的表,例如 tabSta_001,在查询 SET @var1 = (SELECT DESC_POINT FROM @tabSta_ WHERE id_w = @ id_w); 中,我需要 @var 等于 DESC_POINT。例如,DESC_POINT 为“abcdefg”

【问题讨论】:

  • 请提供样本数据、期望的结果,并说明您想要做什么。您的代码没有表变量。它似乎有一个字符串被误用作表名。

标签: sql tsql select


【解决方案1】:

谢谢,这是代码,我需要从@table 中获取值DESC_POINT,然后我需要将它添加到列名中,这将不再是问题

SET @id_w = 50000269; --Comment
DECLARE @tbl_name varchar (100)
SET @tbl_name = 'tbl _' + @ id_w
DECLARE @tabSta_ varchar (20)

DECLARE @DropTable varchar (200)
SET @DropTable = 'DROP TABLE' + @ tbl_name


--DROP TABLE TempTableExport
IF OBJECT_ID ('' + @ tbl_name + '') IS NOT NULL EXEC (@DropTable)

DECLARE @CREATE VARCHAR (6144)
SET @CREATE = 'CREATE TABLE' + @ tbl_name + '(ID_R BIGINT, DATE date, TIME time (7), STT int, SV_P1 decimal (6,3))';
EXEC (@CREATE)


--DECLARE @id_w varchar (10) --id_w--
DECLARE @num_point int --number of points--
DECLARE @duplex int --number of points--
DECLARE @pocet int
DECLARE @pocet_d int
DECLARE @poceta_da varchar (3)
DECLARE @poceta varchar (3)
DECLARE @tab_val_ varchar (20)
DECLARE @Bod_ varchar (20)
DECLARE @ItemSQL VARCHAR (6144)
DECLARE @Alter VARCHAR (6144)
DECLARE @Alter_d VARCHAR (6144)
DECLARE @Insert VARCHAR (6144)
DECLARE @Update VARCHAR (6144)
DECLARE @Update_d VARCHAR (6144)
DECLARE @Cycle int
DECLARE @ var1 varchar (max)
Declare @sqla nvarchar (max)
--SET @id_w = 50000157; --Comment

SET @num_point = (SELECT NUM_POINT FROM tabSta_unit WHERE id_w = @ id_w);
SET @duplex = (SELECT MODE_WORK FROM tabSta_unit WHERE id_w = @ id_w);

SET @count = 0

WHILE @pocet <@num_point
BEGIN
SET @ count = @ count + 1;
SET @ count = CAST (@ count AS varchar)
IF @pocet> 0 AND @pocet <= 9
BEGIN
SET @ tab_val_ = 'tabVal_00' + @ count;
SET @tabSta _ = 'tabSta_00' + @ count;
SET @ var1 = (SELECT DESC_POINT FROM @tabSta_ WHERE id_w = @ id_w);
print @ var1;
PRINT @tabSta_;
SET @ Bod_ = 'Bod_00' + @ count;
END
IF @pocet> = 10 AND @pocet <= 99
BEGIN
SET @ tab_val_ = 'tabVal_0' + @ count;
SET @ Bod_ = 'Bod_0' + @ count;
END
IF @count * = 100
BEGIN
SET @ tab_val_ = 'tabVal _' + @ count;
SET @ Point_ = 'Point _' + @ count;
END
SET @Alter = 'ALTER TABLE' + @ tbl_name + 'ADD' + @ Bod_ + 'decimal (6,3) NULL';
EXEC (@Alter)
END
SET @insert = 'INSERT INTO' + @ tbl_name + '(ID_R, DATE, TIME, SV_P1, STT) SELECT tabVal_unit.ID_R, tabVal_unit.DATE, tabVal_unit.TIME, tabVal_unit.SV_P1, tabVal_unit.STT FROM tabVal_unit WH = '+ @ id_w;
EXEC (@insert)


SET @count = 0
WHILE @pocet <@num_point
BEGIN
SET @ count = @ count + 1;
SET @ count = CAST (@ count AS varchar)

IF @pocet> 0 AND @pocet <= 9
BEGIN
SET @ tab_val_ = 'tabVal_00' + @ count;
SET @ Bod_ = 'Bod_00' + @ count;
END
IF @pocet> = 10 AND @pocet <= 99
BEGIN
SET @ tab_val_ = 'tabVal_0' + @ count;
SET @ Bod_ = 'Bod_0' + @ count;
END
IF @count * = 100
BEGIN
SET @ tab_val_ = 'tabVal _' + @ count;
SET @ Point_ = 'Point _' + @ count;
END
SET @Update = 'UPDATE' + @ tbl_name + 'SET' + @ tbl_name + '.' + @ Bod_ + '='+@tab_val_+'.VAL FROM' + @ tbl_name + 'INNER JOIN' + @ tab_val_ + 'ON' + @tbl_name + '. ID_R ='+@tab_val_+'.ID_R';
EXEC (@Update)
END

if @duplex = 11
BEGIN
SET @count = 200
--SET @num_point = @pocet + @num_point
SET @Cycle = @pocet + @num_point
--PRINT @Cycle
WHILE @pocet <@Cycle
BEGIN
SET @ count = @ count + 1;
SET @ count = CAST (@ count AS varchar)
IF @pocet> 200 AND @pocet <= @ Cycle
BEGIN
SET @ tab_val_ = 'tabVal _' + @ count;
SET @ Point_ = 'Point _' + @ count;
END
SET @Alter_d = 'ALTER TABLE' + @ tbl_name + 'ADD' + @ Bod_ + 'decimal (6,3) NULL';
EXEC (@Alter_d)
END



SET @count = 200
SET @Cycle = @pocet + @num_point
WHILE @pocet <@Cycle
BEGIN
SET @ count = @ count + 1;
SET @ count = CAST (@ count AS varchar)

IF @pocet> 200 AND @pocet <= @ Cycle
BEGIN
--PRINT @pocet
--PRINT @Cycle
--PRINT @num_point
SET @ tab_val_ = 'tabVal _' + @ count;
SET @ Point_ = 'Point _' + @ count;
END
SET @Update_d = 'UPDATE' + @ tbl_name + 'SET' + @ tbl_name + '.' + @ Bod_ + '='+@tab_val_+'.VAL FROM' + @ tbl_name + 'INNER JOIN' + @ tab_val_ + 'ON' + @tbl_name + '. ID_R ='+@tab_val_+'.ID_R';
EXEC (@Update_d)```

【讨论】:

    【解决方案2】:

    我不确定您到底想要完成什么。但是,您将变量@tabSta_ 声明为VARCHAR 变量,但您似乎将其用作TABLE 变量,因为您试图在查询SELECT DESC_POINT FROM @tabSta_ WHERE id_w = @ id_w 中从中进行选择。如果您打算将该变量用作表,则需要将其声明为表变量,如下所示,并带有适当的列,就像使用 CREATE TABLE 语句一样。

    DECLARE @tabSta_ TABLE (col1 VARCHAR(10), col2 VARCHAR(10), ...)
    

    【讨论】:

      【解决方案3】:

      尝试使用此代码模式。 select 语句必须只返回一个值

      declare @my_variable as varchar(20)
      
      select @my_variable=value from table where id=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 2014-01-20
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多