Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование параметров в кач-ве имени таблицы [D7, MSSQL]


Megabyte ©   (2006-06-22 12:38:00) 

CREATE PROCEDURE [dbo].[Add_rule]
@log varchar(20),
@kind varchar(20),
@type int,
@item varchar(50)
AS
declare @item_key int

select IdKey
from @kind
       where Description = @item
       ...
GO

Ругается, говорит: Error 137: Must declare the variable '@kind'
Можно ли вообще использовать параметры в качестве имени таблицы?
Когда пишу туда конкретное имя, то не ругается.


Megabyte   (2006-06-23 12:44:00) [1]

Наконец-то разобрался. %)
@aitem тоже пришлось вынести как параметр самой проыедуры, а не динамического запроса.
Всем спасибо! Узнал много полезных фишек. =)


Megabyte   (2006-06-22 18:51:00) [2]

Попробую.


sniknik   (2006-06-22 17:47:00) [3]

так ты 100% тоже самое, тот же параметр, в динамический запрос передал... а имя таблици параметром быть не может, для того и делалось формирование динамически чтобы подставить значение парамета с именем, а не опять параметр...
....
select @SQL = N'Select @item_key = IdKey from '+@akind+' where Description = @aitem'
execute sp_executesql @SQL,
   N'@Item_key int output,  @item varchar(50)',
....


Megabyte   (2006-06-22 17:29:00) [4]

CREATE PROCEDURE [dbo].[Add_rule]
@log varchar(20),
@kind varchar(20),
@type int,
@item varchar(50)
AS
declare @item_key int
declare @akindvarchar(20)
declare @aitem varchar(50)
declare @SQL nvarchar(400)
--добавление разрешения на вывод отчета по одному объекту
select @SQL = N'Select @item_key = IdKey from @akindwhere Description = @aitem'
execute sp_executesql @SQL,
    N'@Item_key int output,   @akind varchar(20), @item varchar(50)',
@item_key output, @kind, @item;
insert into Access_fin(Login, Type, Item)
values(@log, @type, @item_key)
GO

Разобрался вроде с sp_executesql
Опять та же фигня, только ошибка выскакивает не на этапе построения ХП, а на этапе запуска: Must declare the variable '@akind'


Ega23   (2006-06-22 15:49:00) [5]


 Declare @NaSQL nvarchar(4000);

Select @NaSQL=Cast(('Select @Item_key=IdKey from '+@akind+' where Description=@item') as nvarchar(4000));

execute sp_executesql @NaSQL,
    N'@Item_key int output, @item int',
    @ObjID output, @item;


Вроде так...


Ega23   (2006-06-22 15:44:00) [6]

set @sql = 'select IdKey from ' + @akind + ' where Description = ' + @item + ' into ' + Cast(@item_key as varchar(10))

Только, дружище, всё равно это туфта


Megabyte   (2006-06-22 15:36:00) [7]

Дабы не плодить темы, спрошу здесь:
CREATE PROCEDURE [dbo].[Add_rule]
@log varchar(20),
@kind varchar(20),
@type int,
@item varchar(50)
AS
declare @item_key int
declare @akind varchar(20)
declare @sql varchar(100)
set @akind = @kind
--добавление разрешения на вывод отчета по одному объекту
set @sql = 'select IdKey from ' + @akind + ' where Description = ' + @item + ' into ' + @item_key
exec(@sql)
insert into Access_fin(Login, Type, Item)
values(@log, @type, @item_key)
GO

Это полный код ХП. Делаю селект, чтобы получит значение IdKey. Мне надо присвоить результат запроса переменной @item_key.
Ошибка странная: ошибка конвертирования значения типа Varchar'select IdKey from ' + @akind + ' where Description = ' + 'мое конкретное значение' в @item_key  типа int.
Объясните, почему результат запроса имеет тип Varchar, если поле IdKey имеет тип int?
Я так понимаю, что это связано с подобным способом формирования запроса.
Т.е. надо использовать конвертирование формата?


paul_k   (2006-06-22 15:22:00) [8]

В таком варианте возможны грабли с правами на доступ к таблице


Megabyte   (2006-06-22 14:26:00) [9]

Спасибо.


sniknik   (2006-06-22 12:46:00) [10]

> Можно ли вообще использовать параметры в качестве имени таблицы?
нет. но можно составить запрос динамически... для примера

DECLARE @Name VarChar(30)
DECLARE @Sql VarChar(300)

SET @Name = 'TableName'
SET @Sql = 'SELECT * FROM '+@Name

Exec(@Sql)


тут можно имя и из параметра брать


Наверх

Титульная страница Поиск, карта сайта Написать письмо