0

我在执行一个 SQL 查询时遇到问题,下面是我的存储过程

询问

ALTER PROCEDURE ProcName
(
     @iID VARCHAR(50),
     @AccountID INT
)
AS
SET NOCOUNT ON

DECLARE @Sql VARCHAR(MAX)

SET @Sql = 'DELETE FROM ReferringPhysician WHERE iID IN(' + @iID + ') AND AccountID = '+ @AccountID + ''
EXEC (@Sql)

我正在尝试执行此查询,但它给了我错误,因为我正在使用exec(),在我的 where 条件下我正在处理string,而在另一个条件下我正在处理int,所以在第二个条件下我遇到了转换错误!我怎样才能度过难关?

任何帮助是极大的赞赏!

谢谢

4

2 回答 2

4

您的查询容易受到 SQL 注入的影响。

避免您遇到的数据类型问题的一种方法是在您可以使用和不使用的地方传递正确的数据类型EXEC()更多详细信息here):

DECLARE @sql NVARCHAR(MAX) = N'DELETE dbo.referringPhysician
    WHERE iID IN (' + @iID + ') AND AccountID = @AccountID;';

EXEC sp_executesql @sql, N'@AccountID INT', @AccountID;

您可以通过使用表值参数并传入具有适当类型而不是逗号分隔字符串的 DataTable 或其他集合来完全防止 SQL 注入。例如:

CREATE TYPE dbo.iIDs TABLE(iID INT PRIMARY KEY);

现在您的存储过程可以完全避免动态 SQL:

ALTER PROCEDURE dbo.ProcName -- always use schema prefix!
  @iIDs dbo.iIDs READONLY,
  @AccountID INT
AS
BEGIN
  SET NOCOUNT ON;

  DELETE r
    FROM dbo.ReferringPhysician AS r
    INNER JOIN @iIDs AS i
    ON r.iID = i.iID
    WHERE r.AccountID = @AccountID;
END
GO
于 2013-04-22T15:54:11.823 回答
0

试试这个:

ALTER PROCEDURE ProcName
(
     @iID VARCHAR(50),
     @AccountID INT
)
AS
SET NOCOUNT ON

DECLARE @Sql VARCHAR(MAX)

SET @Sql = 'DELETE FROM ReferringPhysician WHERE iID IN(' + CAST(@iID AS VARCHAR) + ') AND AccountID = '+ CAST(@AccountID AS VARCHAR) + ''
EXEC (@Sql)
于 2013-04-22T15:54:04.477 回答