Параметр, как имя для новой таблицы в SP (MS SQL)
От: Good Man  
Дата: 18.03.02 17:43
Оценка:
По средством хранимой процедуры пытаюсь создать новую таблицу в SQL Server 7.0. Делаю это так:

CREATE PROCEDURE New_Table
@Name_Scheme nvarchar (15) = "Новая таблица"

AS

CREATE TABLE [@Name_Scheme] (
[Call] int NULL,
[Type] nvarchar (1) NULL,
[Name] nvarchar (10) NULL,
[Info_Text] nvarchar (100) NULL,
[Info_Text1] nvarchar (100) NULL,
[Info_Text2] nvarchar (100) NULL,

….

Параметр не передается, а новая таблица создается с именем параметра – @Name_Scheme. Подскажите, пожалуйста, как правильно задать синтаксис в stored procedure.
Best wishes, Taras
Re: Параметр, как имя для новой таблицы в SP (MS SQL)
От: IT Россия linq2db.com
Дата: 18.03.02 20:43
Оценка:
Здравствуйте Good Man, Вы писали:

GM>По средством хранимой процедуры пытаюсь создать новую таблицу в SQL Server 7.0. Делаю это так:


А если так?

CREATE PROCEDURE New_Table
@Name_Scheme nvarchar (15) = "[Новая таблица]"
AS

CREATE TABLE @Name_Scheme (
...


Хотя что-то мне подсказывает, что это тоже работать не будет.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.03.02 21:28
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Good Man, Вы писали:


GM>>По средством хранимой процедуры пытаюсь создать новую таблицу в SQL Server 7.0. Делаю это так:


IT>А если так?


IT>
IT>CREATE PROCEDURE New_Table
IT>@Name_Scheme nvarchar (15) = "[Новая таблица]"
IT>AS

IT>CREATE TABLE @Name_Scheme (
IT>...
IT>


IT>Хотя что-то мне подсказывает, что это тоже работать не будет.


Динамичнее нужно быть... Насколько я помню можно примерно так:

CREATE PROCEDURE New_Table
@StrVar varchar (1500) = "любое динамическое SQL-выражение"
AS
  Exec @StrVar


Может и ошибаюсь... Давно дело было. Но что-то вроде есть обязательно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Параметр, как имя для новой таблицы в SP (MS SQL)
От: vav Россия  
Дата: 19.03.02 03:40
Оценка:
CREATE PROCEDURE New_Table
@Name_Scheme nvarchar (15) = "Новая таблица"
AS

Declare @Str = '
CREATE TABLE [@Name_Scheme] (
[Call] int NULL,
[Type] nvarchar (1) NULL,
[Name] nvarchar (10) NULL,
[Info_Text] nvarchar (100) NULL,
[Info_Text1] nvarchar (100) NULL,
[Info_Text2] nvarchar (100) NULL,
...
'
REPLACE(@Str,'@Name_Scheme',@Name_Scheme)

Exec @Str
Re[2]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Good Man  
Дата: 19.03.02 06:20
Оценка:
Здравствуйте vav, Вы писали:



vav>CREATE PROCEDURE New_Table

vav>@Name_Scheme nvarchar (15) = "Новая таблица"
vav>AS

vav>Declare @Str = '

vav>CREATE TABLE [@Name_Scheme] (
vav>[Call] int NULL,
vav>[Type] nvarchar (1) NULL,
vav>[Name] nvarchar (10) NULL,
vav>[Info_Text] nvarchar (100) NULL,
vav>[Info_Text1] nvarchar (100) NULL,
vav>[Info_Text2] nvarchar (100) NULL,
vav>...
vav>'
vav>REPLACE(@Str,'@Name_Scheme',@Name_Scheme)

vav>Exec @Str



Уважаемый vav, попытался использовать ваш пример:

CREATE PROCEDURE New_Table
@Name_Scheme nvarchar (15) = "Новая таблица"
AS

Declare @Str = ''
CREATE TABLE [@Name_Scheme] (
[Call] int NULL,
[Type] nvarchar (1) NULL,
[Name] nvarchar (10) NULL,
[Info_Text] nvarchar (100) NULL,
[Info_Text1] nvarchar (100) NULL,
[Info_Text2] nvarchar (100) NULL)

REPLACE(@Str,'@Name_Scheme',@Name_Scheme)

Exec @Str

Появляются следующие ошибки:

Server: Msg 170, Level 15, State 1, Procedure New_Table, Line 5
Line 5: Incorrect syntax near '='.
Server: Msg 170, Level 15, State 1, Procedure New_Table, Line 13
Line 13: Incorrect syntax near '
REPLACE(@Str,'.
Server: Msg 105, Level 15, State 1, Procedure New_Table, Line 14
Unclosed quotation mark before the character string ',@Name_Scheme)

Exec @Str
'.
Best wishes, Taras
Re[3]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: vav Россия  
Дата: 19.03.02 06:47
Оценка:
Я понимаю, что написал не точно — извиняюсь, но все же думать тоже надо...

vav>>CREATE PROCEDURE New_Table

vav>>@Name_Scheme nvarchar (15) = "Новая таблица"
vav>>AS

Declare @Str varchar
Set @Str =
'
vav>>CREATE TABLE [@Name_Scheme] (
vav>>[Call] int NULL,
vav>>[Type] nvarchar (1) NULL,
vav>>[Name] nvarchar (10) NULL,
vav>>[Info_Text] nvarchar (100) NULL,
vav>>[Info_Text1] nvarchar (100) NULL,
vav>>[Info_Text2] nvarchar (100) NULL,
vav>>...
vav>>'

vav>>REPLACE(@Str,'@Name_Scheme',@Name_Scheme)


vav>>Exec @Str


Если пишешь в редакторе с подсветкой SQL-синтаксиса, то весь текст
от "CREATE TABLE " до
"[Info_Text2] nvarchar (100) NULL,
..." должен быть выделен как строка (в Query Analayser по умолчанию красный)
Re[4]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Lexey Россия  
Дата: 19.03.02 08:07
Оценка:
Здравствуйте vav, Вы писали:

vav>Я понимаю, что написал не точно — извиняюсь, но все же думать тоже надо...


vav>>>CREATE PROCEDURE New_Table

vav>>>@Name_Scheme nvarchar (15) = "Новая таблица"
vav>>>AS

И зачем так сложно?

vav>Declare @Str varchar --тут еще размер нужно задавать

vav>Set @Str =
'
vav>>>CREATE TABLE [@Name_Scheme] (
vav>>>[Call] int NULL,
vav>>>[Type] nvarchar (1) NULL,
vav>>>[Name] nvarchar (10) NULL,
vav>>>[Info_Text] nvarchar (100) NULL,
vav>>>[Info_Text1] nvarchar (100) NULL,
vav>>>[Info_Text2] nvarchar (100) NULL,
vav>>>...
vav>>>'

vav>>>REPLACE(@Str,'@Name_Scheme',@Name_Scheme)


vav>>>Exec @Str


Declare @Str varchar(4000)
Set @Str='CREATE TABLE ['+@Name_Scheme+'] (
[Call] int NULL, 
[Type] nvarchar (1) NULL, 
[Name] nvarchar (10) NULL, 
[Info_Text] nvarchar (100) NULL, 
[Info_Text1] nvarchar (100) NULL, 
[Info_Text2] nvarchar (100) NULL,
...)'

exec @Str.

И не нужно никаких replace'ов.
Re[5]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Merle Австрия http://rsdn.ru
Дата: 19.03.02 08:42
Оценка:
Здравствуйте Lexey, Вы писали:


L>

L>exec @Str.
L>

L>И не нужно никаких replace'ов.

Ага... Только, на сколько я помню надо
 exec(@Str)

А то exec может подумать, что @str это хранимая процедура...
)
Мы уже победили, просто это еще не так заметно...
Re[6]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Lexey Россия  
Дата: 19.03.02 08:47
Оценка:
Здравствуйте Merle, Вы писали:

M>Ага... Только, на сколько я помню надо

M>
 exec(@Str)


Факт.

M>А то exec может подумать, что @str это хранимая процедура...

M>))

Да не просто может, а подумает.
Re[7]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Good Man  
Дата: 19.03.02 10:23
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Merle, Вы писали:


M>>Ага... Только, на сколько я помню надо

M>>
 exec(@Str)


L>Факт. :)


M>>А то exec может подумать, что @str это хранимая процедура...

M>>))

L>Да не просто может, а подумает. :))


Ну и как теперь из Query Analayser можно создать новую таблицу?

Exec New_Table Table1

Где «Table1” имя новой таблицы. Так не работает.
Создает таблицу с именем «+@Name_Scheme+»
Best wishes, Taras
Re[8]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Lexey Россия  
Дата: 19.03.02 10:54
Оценка:
Здравствуйте Good Man, Вы писали:

GM>Ну и как теперь из Query Analayser можно создать новую таблицу?


GM>Exec New_Table Table1


Eexec New_Table 'Table1'

GM>Где «Table1” имя новой таблицы. Так не работает.

GM>Создает таблицу с именем «+@Name_Scheme+»

Не знаю, что ты там наворотил, но с такой процедурой все работает:

CREATE PROCEDURE New_Table    @Name_Scheme varchar (100) AS
Declare @Str varchar(4000)
Set @Str='CREATE TABLE ['+@Name_Scheme+'] (
[Call] int NULL, 
[Type] nvarchar (1) NULL, 
[Name] nvarchar (10) NULL, 
[Info_Text] nvarchar (100) NULL, 
[Info_Text1] nvarchar (100) NULL, 
[Info_Text2] nvarchar (100) NULL)'
exec(@Str)
Re[9]: Параметр, как имя для новой таблицы в SP (MS SQL)
От: Аноним  
Дата: 19.03.02 14:03
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Good Man, Вы писали:


GM>>Ну и как теперь из Query Analayser можно создать новую таблицу?


GM>>Exec New_Table Table1


L>Eexec New_Table 'Table1'


GM>>Где «Table1” имя новой таблицы. Так не работает.

GM>>Создает таблицу с именем «+@Name_Scheme+»

L>Не знаю, что ты там наворотил, но с такой процедурой все работает:


L>
L>CREATE PROCEDURE New_Table    @Name_Scheme varchar (100) AS
L>Declare @Str varchar(4000)
L>Set @Str='CREATE TABLE ['+@Name_Scheme+'] (
L>[Call] int NULL, 
L>[Type] nvarchar (1) NULL, 
L>[Name] nvarchar (10) NULL, 
L>[Info_Text] nvarchar (100) NULL, 
L>[Info_Text1] nvarchar (100) NULL, 
L>[Info_Text2] nvarchar (100) NULL)'
L>exec(@Str)
L>


Большое спасибо
:)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.