Sql server 使用存储过程获取nvarchar(20)值列表作为参数

Sql server 使用存储过程获取nvarchar(20)值列表作为参数,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在开发一个SQL Server 2012存储过程 我需要返回nvarhar20值的列表,但我不知道如何才能返回。我试过这个: 使用表值参数,但必须为只读。 执行选择以返回该列表。但仅限于存储过程 返回INT值。 有什么想法吗 更新: 这就是我所做的: CREATE PROCEDURE [dbo].[GetAggregationChildren] @parentCode nvarchar(20), @codeLevel tinyint output, @returnVa

我正在开发一个SQL Server 2012存储过程

我需要返回nvarhar20值的列表,但我不知道如何才能返回。我试过这个:

使用表值参数,但必须为只读。 执行选择以返回该列表。但仅限于存储过程 返回INT值。 有什么想法吗

更新: 这就是我所做的:

CREATE PROCEDURE [dbo].[GetAggregationChildren]
    @parentCode nvarchar(20),
    @codeLevel tinyint output,
    @returnValue int output
AS
    declare @childsLevelCount tinyint
          , @invalidChildCodesCount int;    

    set nocount on;
    -- ======== VALIDATION ==========
    if NULLIF(@parentCode, '') IS NULL
    begin
        set @returnValue = -19;
        return NULL; -- Parameter null or empty.
    end

    -- Check if parent exists in AGGREGATIONS table.
    if not exists (Select top 1 CODE from AGGREGATIONS where CODE = @parentCode)
    begin
        set @returnValue = -11;
        return NULL;
    end

    set @childsLevelCount = (select count(c.CODE_LEVEL) from CODES c where c.CODE in (Select CODE from AGGREGATION_CHILDS where PARENT_CODE = @parentCode) group by c.CODE_LEVEL);

    -- If this aggregation has children codes with different values, it is an error.
    if (@childsLevelCount > 1)
    begin
        set @returnValue = -201;
        return NULL;
    end

    -- =========== CODE =============
    set @returnValue = 0;

    set @codeLevel = (select c.CODE_LEVEL from CODES c where c.CODE in (Select CODE from AGGREGATION_CHILDS where PARENT_CODE = @parentCode) group by c.CODE_LEVEL);

    select CODE from AGGREGATION_CHILDS where PARENT_CODE = @parentCode;
但是,我不知道如何返回此选择的结果: 从聚合_CHILDS中选择代码,其中PARENT_CODE=@parentCode

此存储过程在SQL Server Management Studio上返回以下内容:

它还返回一个0。我认为存储过程只返回select结果

我需要一个参数中的结果,因为我将在下面这样的SQLCommand中使用:

SqlParameter childsParam = new SqlParameter();
childsParam.ParameterName = "@childs";
childsParam.SqlDbType = System.Data.SqlDbType.Structured;
childsParam.Direction = System.Data.ParameterDirection.Input;
childsParam.Value = tvp;

parameters = new List<SqlParameter>();
parameters.Add(childsParam);

SqlConnection connection =
    _context.Database.Connection as SqlConnection;
connection.Open();

SqlCommand cmd = new SqlCommand();

cmd.CommandText = storedProcedureName;
cmd.CommandType = CommandType.StoredProcedure;

if (parameters != null)
    cmd.Parameters.AddRange(parameters.ToArray());

cmd.Connection = connection;

cmd.ExecuteNonQuery();

connection.Close();
存储过程只返回整数

不,这不是100%正确。如果使用从存储过程返回值,则语句为true,否则为false

如果要从存储过程返回字符串,可以使用如下选择:

CREATE PROCEDURE myProc
AS
BEGIN
   SELECT 'test'
END
要返回多个值,可以像

CREATE PROCEDURE myProc 
    @Value1 varchar(20) OUTPUT, 
    @Value2 varchar(20) OUTPUT
AS
    SELECT @Value1 = 'test1', @Value2 = 'test2'
就这样说吧

    DECLARE @Value1 varchar(20), @Value2 varchar(20)
    exec myProc @Value1 OUTPUT, @Value2 OUTPUT
    SELECT @Value1, @Value1

存储过程返回SELECT语句中字段的类型。可以使用“强制转换”和“转换”来更改类型。例如: 选择CASTfield作为NVARCHAR20

使用表值参数,可以在创建时设置字段类型:

CREATE TYPE JobSpecifications AS TABLE 
(JobName VARCHAR(50),  AvailableDate Date );

您可以使用临时表从存储过程中恢复列表,如下例所示:

create proc Test
AS BEGIN

SELECT CAST('jkj' AS NVARCHAR(20)) value 

END

DECLARE @tmp TABLE(value nvarchar(20))

INSERT INTO @tmp EXEC GhaziTest

SELECT * from @tmp

感谢您的回答,但如果我将JobSpecifications用作参数,则它必须是只读的。感谢您的回答,但我需要返回两个以上的值。@VansFannel:-我不明白。您在寻找什么?我需要使用SqlCommand以C代码执行此存储过程。所以,我需要将其作为参数返回。@VansFannel:-您可以编辑您的问题并在那里添加您的过程,以便更容易理解您试图实现的目标吗?@PeterSmith我在执行选择时选中它,它将返回所有数据,但我需要将该数据返回到参数中。您的列表中有多少项?实际上,您是否正在尝试将列返回到呼叫应用程序?谢谢。这个答案有效,但我不能将它与C SQLCommand一起使用。将它放在一个过程中,并使用SQLCommands从应用程序调用它。对不起,我已经对它进行了测试,您可以从存储过程返回一个表。