2012-02-23 4 views
5

Может кто-нибудь проверить мое заявление ...Объявление переменных SQL - SQL Server

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName ='SELECT DISTINCT o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE ''%empty%''' 

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

моя ошибка ...

Msg 1087, Level 15, состояние 2, строка 1
Должен объявить переменную таблицы "@tblName".

То, что я хочу сделать, это получить имя таблицы на переменную @tblName и вставить данные в @strSQL переменной

Например ... результат в @tblName является CustomerInfo

затем в @strSQL I будет использовать результат в @tblName как имя моей таблицы в моей команде вставки.

Таким образом, переменная @strSQL будет;

INSERT INTO CustomerInfo VALUES(......) 
+1

Возможный дубликат [SQL Declare Variables] (http://stackoverflow.com/questions/9407703/sql-declare-variables) –

ответ

2

Попробуйте это от моего ответа на ваш другой вопрос:

SELECT TOP 1 @tblName = t.name 
FROM sys.tables t 
INNER JOIN sys.indexes i on i.object_id = t.object_id 
WHERE t.name LIKE '%empty%' 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Вы еще не говоря уже о версии SQL Server, который вы используете. Но с SQL Server 2005 или новее вы должны прекратить использовать sysobjects и sysindexes - вместо этого используйте новую схему sys, которая содержит более или менее ту же информацию, но более легко доступна.

См. [MSDN: запрос системного каталога SQL Server] [1] для получения более подробной информации о том, что доступно в новой схеме sys, и о том, как максимально использовать ее!

+0

oops, my bad, я использую SQL Server 2008, nway..thanks 4 d help –

+0

еще одна вещь ... что, если я собираюсь использовать инструкцию IF в @strSQL перед командой insert, потому что сначала хочу проверить, будут ли значения, которые я собираюсь вставить в не существует в таблице. Извините за многие вопросы ... coz Я только начинаю изучать sql. –

2

При объявлении более одной переменной с одним оператором DECLARE, you only put the type once (в конце):

DECLARE @tblName, @strSQL varchar(MAX) 
+0

Я мог бы поклясться, что исходный вопрос был о MySql (это то, что я ответил). Похоже, Sql Server допускает повторные определения типов в операторах DECLARE – colithium

+0

Этот ответ неверен. SQL Server НЕ разрешает 'DECLARE @tblName, @strSQL varchar (MAX)'. Один * должен * указать тип каждой переменной: 'declare @i int, @t varchar (max);' –

1

Это должно быть что-то действительно может работать:

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName = (SELECT DISTINCT TOP 1 o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE '%empty%') 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Anything в цитате означает, что это строка и не ожидайте, что sql-сервер запустит ее как оператор, то же самое для переменной в строке, вы не можете процитировать ее

+0

'DSINTINCT' ** и **' TOP 1' немного слишком много ..... if у вас только 1 результат, у него не может быть дубликатов в любом случае ..... –

+0

Просто хочу убедиться, что он не будет разбиваться, поскольку может быть какая-то другая таблица имеет схожее имя –

Смежные вопросы