Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос работает- функция - нет.  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Уважаемые коллеги!
Прошу помочь в неясной для меня ситуации.
Запрос

select top 1 AuthorSign from library2.dbo.ALL__BOOK where subdb = 'book' and docid = 1161
выдает правильный ответ

М62

Однако если написать функцию

СREATE FUNCTION [dbo].[GetAS] (@base varchar, @docid int)
RETURNS varchar

AS
BEGIN
return (select top 1 AuthorSign from library2.dbo.ALL__BOOK where subdb = @base and docid = @docid)

END;

запрос

select top 5 libra1.dbo.getas('book', 1161) from library2.dbo.book__doc where docid=1161
возвращает
NULL

Аналогично 0 возвращает функция на count(*) числа строк.

Это для меня неясно.
20 ноя 13, 13:32    [15161264]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
а что возвращает ???

select * from library2.dbo.book__doc where docid=1161
20 ноя 13, 13:35    [15161298]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
Glory
Member

Откуда:
Сообщений: 104751
@base varchar == @base varchar(1)
20 ноя 13, 13:35    [15161307]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
Ну так таблицы в запросах разные - вот и результат разный.
20 ноя 13, 13:37    [15161317]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
topdon,

СREATE FUNCTION [dbo].[GetAS] (@base varchar (10), @docid int)

выполните и поймете:
declare @base varchar
set @base = 'book'
select @base
20 ноя 13, 13:41    [15161357]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
StarikNavy,

Пока не понял. Такая же история с другой аналогичной функци
ей, к-я подсчитывает число соотв. строк в другой таблице

ALTER FUNCTION [dbo].[KOLEKZ] (@base varchar, @docid int)
RETURNS integer

AS
BEGIN
declare @col integer;
set @col = (select count(docid) from library2.dbo.ALL__BOOK where subdb = @base and docid = @docid)
return @col

END;

запрос select count(docid) from library2.dbo.ALL__BOOK where subdb ='book' and docid = 1161
возвращает

50

а запрос для к-го писалась функция

0
0

получается как в функцию нельзя получать заведомое число, а в запросе (как теле функции)- можно?!
20 ноя 13, 14:52    [15162046]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
Glory
Member

Откуда:
Сообщений: 104751
topdon
получается как в функцию нельзя получать заведомое число, а в запросе (как теле функции)- можно?!

запросы
select count(docid) from library2.dbo.ALL__BOOK where subdb ='b' and docid = 1161
и
select count(docid) from library2.dbo.ALL__BOOK where subdb ='book' and docid = 1161

вообще тот разные
20 ноя 13, 14:58    [15162117]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
topdon,
(фэйспалм)
вам уже два человека написали, красным цветом выделили
declare @base varchar
содержит ОДИН символ

declare @base varchar (10)
содержит 10 символов


declare @base varchar, @base2 varchar (10)
set @base = 'book'
set @base2 = 'book'
select @base, @base2
20 ноя 13, 15:09    [15162245]     Ответить | Цитировать Сообщить модератору
 Re: Запрос работает- функция - нет.  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Glory,

ребята, спасибо,
понял кажется.
Исправил функцию

ALTER FUNCTION [dbo].[KOLEKZ] (@base varchar (20), @docid int)
RETURNS integer

AS
BEGIN
declare @col integer;
set @col = (select count(docid) from library2.dbo.ALL__BOOK where subdb = @base and docid = @docid)
return @col

END;
20 ноя 13, 15:11    [15162258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить