Проблема с возвратом результатов SQL - PullRequest
0 голосов
/ 05 сентября 2018
DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT Field1 
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

IF @Field1 = 'Gary' OR @Field1 = 'Sarah'
    SET @ReturnValue = '1'
ELSE 
    SET @ReturnValue = '0';

По сути, я хочу вернуть значение, а затем установить это значение. Я работаю с программой, это очень обидно, что она возвращает. Таким образом, я получаю эту ошибку в SQL Management Studio:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ниже приведено то, что у меня было раньше, оно вернуло бы результаты, но программа не взяла бы результаты и правильно присвоила его, куда мне нужны эти файлы.

SELECT 
    CAST(CASE       
            WHEN Field1 = 'Gary' OR Field1 = 'Sarah'            
               THEN 1                 
               ELSE 0   
         END AS BIT) AS [ReturnValue], 
    * 
FROM 
    [Workflow Creation].[dbo].[ssfields];

Спасибо

JimmyDean

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Ваша проблема в следующих строках:

DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT Field1 
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

@Field1 - это значение VARCHAR (не переменная TABLE), и ваш выбор возвращает несколько строк, поскольку в таблице ssFields имеется более 1 строки с Field1 = 'Gary'. Вот почему вы получаете сообщение об ошибке:

Подзапрос вернул более 1 значения

Чтобы исправить это, вы можете использовать TOP 1 внутри SELECT. Это всегда будет возвращать либо 0, либо 1 строку (и никогда больше), и это сообщение не появится.

DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT TOP 1 Field1                        -- Here
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

Однако я считаю, что это именно то, что вы ищете:

DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50) = 'Gary'

IF EXISTS ( SELECT 'the searched field exists!!'
            FROM [Workflow Creation].[dbo].[ssFields] 
            WHERE Field1 = @Field1)
BEGIN
    SET @ReturnValue = 1 -- Don't use literals if it's a number!
END
ELSE
BEGIN
    SET @ReturnValue = 0 -- Don't use literals if it's a number!
END
0 голосов
/ 05 сентября 2018

причина, по которой вы получаете эту ошибку, заключается в том, что вы можете назначить только один элемент вашей переменной @ Field1. SQL Server думает, что вы пытаетесь назначить несколько nvarchars одной переменной @ Field1. Вот как исправить ваш запрос:

DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT TOP 1 Field1 
               FROM YourTable
               WHERE Field1 = 'Gary')

IF @Field1 = 'Gary' OR @Field1 = 'Sarah'
    SET @ReturnValue = '1'
ELSE 
    SET @ReturnValue = '0';

SELECT @ReturnValue --will be 1

Когда вы используете SELECT TOP 1 Field1 FROM YourTable, вы явно указываете SQL Server взять возвращаемую верхнюю запись и присвоить результат Column для Field1 вашей переменной @ Field1.

Если у вас есть несколько результатов, которые вы хотите захватить, тогда временная таблица может сделать это:

CREATE TABLE #Field1s (
    Id INT PRIMARY KEY IDENTITY (1,1),
    IsGaryOrSarah BIT NOT NULL
)

INSERT INTO #Field1s
SELECT CASE WHEN Field1 = 'Gary' THEN 1
            WHEN Field1 = 'Sarah' THEN 1
            ELSE 0 END
FROM YourTable
SELECT * FROM #Field1s

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...