как использовать имя таблицы как переменную? [Дубликат]

Как упоминалось другими, последний хромированный редуктор сделал для меня трюк. Если вы скачали драйвер вручную и хотите сообщить appium, чтобы использовать новый хромированный рекордер, вы можете сделать это с помощью этой команды:

appium --chromedriver-executable /path/to/driver/chromedriver ....

120
задан Imran Ali Khan 24 June 2015 в 11:35
поделиться

7 ответов

Названия таблиц и имена столбцов должны быть статическими, если запрос статичен. Для динамических имен таблиц или столбцов вы должны генерировать полный SQL динамически и использовать sp_executesql для его выполнения.

Подробнее здесь: Проклятие и благословения динамического SQL

95
ответ дан mdma 28 August 2018 в 09:12
поделиться

Измените последнее утверждение следующим образом:

EXEC('SELECT * FROM ' + @tablename)

Вот как я делаю свое действие в хранимой процедуре. Первый блок объявит переменную и задает имя таблицы на основе имени текущего года и месяца, в этом случае TEST_2012OCTOBER. Затем я проверяю, существует ли он в БД, и удалите, если это произойдет. Затем следующий блок будет использовать инструкцию SELECT INTO для создания таблицы и заполнить ее записями из другой таблицы параметрами.

--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name = 
    (SELECT 'TEST_'
            + DATENAME(YEAR,GETDATE())
            + UPPER(DATENAME(MONTH,GETDATE())) )

--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name 
          FROM sysobjects 
          WHERE name = @table_name AND xtype = 'U')

BEGIN
    EXEC('drop table ' +  @table_name)
END

--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
65
ответ дан Adi Inbar 28 August 2018 в 09:12
поделиться

Используйте sp_executesql для выполнения любого SQL, например

DECLARE @tbl    sysname,
        @sql    nvarchar(4000),
        @params nvarchar(4000),
        @count  int

DECLARE tblcur CURSOR STATIC LOCAL FOR
   SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
   ORDER  BY 1
OPEN tblcur

WHILE 1 = 1
BEGIN
   FETCH tblcur INTO @tbl
   IF @@fetch_status <> 0
      BREAK

   SELECT @sql =
   N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
   N' WHERE LastUpdated BETWEEN @fromdate AND ' +
   N'                           coalesce(@todate, ''99991231'')'
   SELECT @params = N'@fromdate datetime, ' +
                    N'@todate   datetime = NULL, ' +
                    N'@cnt      int      OUTPUT'
   EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT

   PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END

DEALLOCATE tblcur
4
ответ дан bzlm 28 August 2018 в 09:12
поделиться

Вы не можете использовать имя таблицы для переменной, вам нужно будет это сделать:

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
31
ответ дан dcp 28 August 2018 в 09:12
поделиться

Бит поздно для ответа, но должен помочь кому-то другому:

CREATE PROCEDURE [dbo].[GetByName]
    @TableName NVARCHAR(100)
    AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @sSQL nvarchar(500);

    SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName);

    EXEC sp_executesql @sSQL



END
27
ответ дан eddie_cat 28 August 2018 в 09:12
поделиться
Declare @fs_e int, @C_Tables CURSOR, @Table varchar(50)

SET @C_Tables = CURSOR FOR
        select name from sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 AND name like 'TR_%'
OPEN @C_Tables
FETCH @C_Tables INTO @Table
    SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'

WHILE ( @fs_e <> -1)
    BEGIN
        exec('Select * from '+ @Table)
        FETCH @C_Tables INTO @Table
        SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'
    END
-1
ответ дан Laurent 28 August 2018 в 09:12
поделиться

Вам нужно будет генерировать sql динамически:

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500)

set @sql = 'select * from ' + @tablename 

exec (@sql)
10
ответ дан t-clausen.dk 28 August 2018 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: