Sql server 使用存储过程获取nvarchar(20)值列表作为参数
我正在开发一个SQL Server 2012存储过程 我需要返回nvarhar20值的列表,但我不知道如何才能返回。我试过这个: 使用表值参数,但必须为只读。 执行选择以返回该列表。但仅限于存储过程 返回INT值。 有什么想法吗 更新: 这就是我所做的: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
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从应用程序调用它。对不起,我已经对它进行了测试,您可以从存储过程返回一个表。