【问题标题】:Use a stored procedure to get a list of nvarchar(20) values as a parameter使用存储过程获取 nvarchar(20) 值列表作为参数
【发布时间】:2016-01-07 20:09:44
【问题描述】:

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

我需要返回一个 nvarchar(20) 值列表,但我不知道该怎么做。我试过这个:

  1. 使用表值参数,但必须是READONLY
  2. 执行选择以返回该列表。但仅限存储过程 返回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;

但是,我不知道如何返回这个选择的结果: select CODE from AGGREGATION_CHILDS where PARENT_CODE = @parentCode;

此存储过程在 SQL Server Management Studio 上返回:

它也返回一个0。我以为存储过程只会返回选择结果。

我需要一个参数中的结果,因为我将在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();

【问题讨论】:

  • @PeterSmith 我检查它是否执行选择并返回所有数据,但我需要将该数据返回到参数中。
  • 您的列表中有多少项?实际上,您是否正在尝试将一列返回给调用应用程序?

标签: sql-server stored-procedures


【解决方案1】:

存储过程只返回整数?

不,这不是 100% 正确的。如果您使用RETURN 从存储过程中返回值,那么您的语句为真,否则为假。

如果你想从你的存储过程中返回字符串,那么你可以像这样使用 SELECT:

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

【讨论】:

  • 感谢您的回答,但我需要返回两个以上的值。
  • @VansFannel:- 我没听懂。你在找什么?
  • 我需要使用 SqlCommand 在 C# 代码中执行这个存储过程。所以,我需要把它作为参数返回。
  • @VansFannel:- 你能编辑你的问题并在那里添加你的程序,以便更容易理解你想要实现的目标吗?
【解决方案2】:

存储过程返回SELECT 语句中的字段类型。您可以使用CASTCONVERT 更改类型。例如: SELECT CAST(field AS NVARCHAR(20))

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

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

【讨论】:

  • 感谢您的回答,但如果我将其用作参数,JobSpecifications 必须是 READONLY
【解决方案3】:

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

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

【讨论】:

  • 谢谢。这个答案有效,但我不能将它与 C# SQLCommand 一起使用。
  • 将其放入一个过程中,并使用 SqlCommand 从您的应用程序中调用它
  • 对不起,我已经测试过了,你可以从存储过程中返回一个表。
猜你喜欢
  • 2020-05-22
  • 2014-01-27
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多