【发布时间】:2019-10-20 22:00:47
【问题描述】:
我可以将字符串传递给不是列名的存储过程吗?
我需要从 C# 调用 StoredProcedure。
以下不起作用,因为没有它的类型就无法定义参数,但显示了我正在尝试做的事情。问题是 Sql 将 @stringToIdentifyDataTable 视为 ColumnName,这看起来很公平,但不是我想要做的。
Alter PROCEDURE [dbo].[PutNewTypeSource] @stringToIdentifyDataTable,
@ID int, @Description varchar(50), @Active bit
AS
DECLARE
@Query AS VARCHAR(MAX),
@Field_Out AS VARCHAR(MAX)
SELECT @Field_Out = CASE @stringToIdentifyDataTable
WHEN 'ReferralSource' THEN '[Adm].[JobReferralSource]'
WHEN 'ReferralSource2' THEN '[Adm].[JobReferralSource2]'
END
SET @Query = concat('
IF EXISTS (SELECT ID FROM ',@Field_Out,' WHERE Description= ',@Description,')
BEGIN
UPDATE ',@Field_Out,
'SET Active = ',@Active,
'WHERE Description= ',@Description,';
END')
EXEC (@Query)
exec [PutNewTypeSource] 'ReferralSource', 1, 'Description1', 0
【问题讨论】:
-
一开始就不能将列名作为参数传递
-
如果你想知道一个变量是否需要一个类型,那么是的,
@stringToIdentifyDataTable需要一个类型。 -
IF EXISTS毫无意义。无论如何,UPDATE 子句只会更新与描述匹配的行。 -
您尚未为
@stringToIdentifyDataTable参数指定类型。 -
这样的程序总是带有大量的代码气味。为什么你有两个可以互换的表,它们需要一个过程?为什么不使用带有列的单个表来区分行类型?或者如果它们是非常不同的表,为什么需要一个过程来更新它们?为什么不只有两个(或更多)程序?
标签: sql sql-server stored-procedures parameters