![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование параметров в кач-ве имени таблицы [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)
тут можно имя и из параметра брать