【问题标题】:SQL Pass a string to a Stored Procedure that is not a Column NameSQL 将字符串传递给不是列名的存储过程
【发布时间】: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


【解决方案1】:

如果我理解正确,您可以这样做。请注意,我正确引用了您的对象,并且重要地为您设置了参数。你以前的东西很容易被注射:

ALTER PROCEDURE [dbo].[PutNewTypeSource] @Referral varchar(50), @Description varchar(50), @Active bit --I remvoed @ID as it was never used
AS BEGIN

    DECLARE @Schema sysname,
            @Table sysname;
    SET @Schema = CASE WHEN @Referral IN ('ReferralSource','ReferralSource2') THEN N'adm' END;
    SET @Table = CASE @Referral WHEN 'ReferralSource' THEN N'JobReferralSource'
                                WHEN 'ReferralSource2' THEN N'JobReferralSource2' END;

    DECLARE @SQL nvarchar(MAX);

    SET @SQL = N'UPDATE ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + NCHAR(13) + NCHAR(10) +
               N'SET Active = @Active' + NCHAR(13) + NCHAR(10) +
               N'WHERE Description= @Description;';

    EXEC sp_executesql @SQL, N'@Description varchar(50), @Active bit', @Description = @Description, @Active = @Active;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2018-09-22
    相关资源
    最近更新 更多