2015-11-24 1 views
0

Очень просто, я вызываю процедуру для получения первичного ключа из одной таблицы, а затем сохраняю ключ в переменной, чтобы затем использовать его для вставки в другую таблицу, которая нужна внешний ключ. Переменная - это то, что я ожидаю, но когда я ее использую, она ничего не возвращает.SQL Server: используйте переменную bigint в хранимой процедуре

После попытки смотреть на него, это, кажется, что его проблема с пунктом WHERE и используя значение переменной

DECLARE @ClientId bigint; 

SELECT * 
FROM Testing.dbo.Client 
WHERE ClientID = @ClientId 

@ClientId является 2

Существует значение 2 для а клиент ID в таблице

Когда я запускаю это я получаю результат я ожидаю

select * 
from Testing.dbo.Client 
where ClientID = 2 

Это где он получает набор

DECLARE @ClientId int; 
EXECUTE @ClientId = Testing.dbo.GetClientID @ClientName; 

Где GetClientID является следующая

USE Testing 
GO 
CREATE PROCEDURE GetClientId 
    @ClientName nvarchar(50) 
AS 
    SELECT ClientID FROM Testing.dbo.Client WHERE ClientName = @ClientName 
GO 

Разработал немного больше сейчас, поэтому ClientId не получает устанавливается после вызова ргос

+0

где/как вы установите значение @ClientId? Потому что в вашем фрагменте вы только объявляете его, а не присваиваете значение. –

+0

Хотя вы можете инициализировать в 'declare', как в ответе ниже, вы обычно используете' set', как в 'set @ClientId = 2;'. Фактически старые версии SQL Server не позволяют выполнять встроенную инициализацию. – shawnt00

ответ

0

мне удалось работать его с помощью выходных переменных, которые я не сталкивались прежде

USE Testing 
GO 
CREATE PROCEDURE AddReading 
@ClientName NVARCHAR(50), 
@MonitorName NVARCHAR(50), 
@DateTime DATETIME, 
@Temperature DECIMAL(12, 10), 
@Humidity DECIMAL (12, 10), 
@Staleness DECIMAL (12, 10) 
AS 
DECLARE @ClientId int; 
EXEC Testing.dbo.GetClientId @ClientName, @ClientId OUTPUT; 

INSERT INTO Testing.dbo.Reading 
(ClientID, MonitorName, DateTime, Temperature, Humidity, Staleness) 
VALUES (@ClientId, @MonitorName, @DateTime, @Temperature, @Humidity, @Staleness); 
GO 

Где прок GetClientId был

USE Testing 
GO 
CREATE PROCEDURE GetClientId 
@ClientName nvarchar(50), 
@ClientId bigint OUTPUT 
AS 
Select @ClientId = ClientID FROM Testing.dbo.Client WHERE ClientName = @ClientName 
GO 

Пожалуйста, дайте мне знать, если вы считаете, что это будет лучший способ сделать это, или если есть лучший способ сделать это.

+0

Скалярная функция, определяемая пользователем, вероятно, будет проще в использовании. По моему опыту полезны ни хранимая процедура (слишком сложная в использовании), ни функция (поощряющая медленное замедление, ряд за строкой, обработка). Абстракции, как правило, являются просачивающимися, и запросы к таблице или виду непосредственно довольно легко. –

+0

Не зная большего изображения, ИМХО лучший способ не помещает эту тривиальную операцию в отдельную хранимую процедуру. Просто поместите код непосредственно в хранимую процедуру «AddReading». Если логика не сложна и используется другими вещами, потому что она сложна. –

+0

Я знаю, что это старо, но если ваш 'USE Testing', почему бы вам« EXEC Testing.dbo.blahblah »и« INSERT INTO Testing.dbo.blahblah »? – Jaberwocky

0

Вам нужно инициализировать переменную, в противном случае она содержит NULL;

DECLARE @ClientId bigint = 2; 
select * from Testing.dbo.Client where ClientID = @ClientId; 

Если у вас есть в списке аргументов не создать переменную с таким именем:

CREATE PROC stored_procedure 
    @ClientID BIGING 
AS 
BEGIN 
    select * from Testing.dbo.Client where ClientID = @ClientId; 
END 
0

Если вы пытаетесь установить переменную с процедурой магазина это правильный путь:

DECLARE @ClientId Table(ClientId int); 

Insert Into @ClientId(ClientId) 
Exec Testing.dbo.GetClientID @ClientName; 

select * 
from Testing.dbo.Client 
where ClientID = (Select ClientId From @ClientId); 

Если процедура магазин выбрасывает много строк изменить = для In так:

select * 
from Testing.dbo.Client 
where ClientID in (Select ClientId From @ClientId); 
0

, если вы хотите использовать, как это:

DECLARE @ClientId int; 
EXECUTE @ClientId = Testing.dbo.GetClientID @ClientName; 

вы можете использовать RETURN @ClientID в процедуре

CREATE PROC proc_GetClientID 
    @ClientNeme VARCHAR(max) 
AS 
BEGIN 
    DECLARE @ClientID BIGINT 
    SELECT @ClientID=1000 
    RETURN @ClientID 
END 


DECLARE @ClientID INT 
EXEC @ClientID =dbo.proc_GetClientID 'test' 
SELECT @ClientID 
Смежные вопросы