【问题标题】:How are strings (varchar) passed into SQL stored procedures?字符串 (varchar) 如何传递到 SQL 存储过程中?
【发布时间】:2016-06-10 15:45:24
【问题描述】:

我正在尝试将字符串传递给存储过程。我的代码是:

CREATE PROCEDURE AddCondition
    @CondName varchar(50),
    @CondDesc varchar(50)
AS
    DECLARE @CondID int

    --This code gets the next ID for the table
    SET @CondID = (SELECT MAX([Condition ID]) FROM [dbo].[Tube Conditions]) + 1
    SET @CondID = ISNULL(@CondID,1)

    --This code adds records to the table
    INSERT INTO [dbo].[Tube Conditions] ([Condition ID],[Condition Name],[Description])
    VALUES (@CondID, @CondName, @CondDesc)
GO

我尝试执行:

DECLARE @aName varchar(50), @aDesc varchar(50)
SET @aName = 'Lathed'
SET @aDesc = 'The tube has been lathed to size'

EXECUTE AddCondition @aName, @aDesc
GO

但我不断收到错误:

消息 245,级别 16,状态 1,过程 AddCondition,第 51 行
将 varchar 值“车床”转换为数据类型 int 时转换失败。

在处理 int 和 float 值时,同样的过程也有效,所以我不确定我在这里缺少什么。我正在使用带有 SQL Server Express 的 SQL Server 2014 Management Studio。

提前致谢!

【问题讨论】:

  • (1) 您的错误消息在第 51 行显示错误,您的 5 行代码中没有第 51 行。 (2) 你可以使用一个标识列而不是那个获取下一个 id 的东西

标签: sql sql-server tsql stored-procedures


【解决方案1】:

从您发布的代码中,只有一件事会产生您指定的错误,那就是表 [dbo].[Tube Conditions] 中的 [Condition Name] 列是 int 类型,而不是插入语句所期望的 varchar .

顺便说一句:这是在表中生成下一个 ID 的一种非常危险的方法 - 当同时插入 2 条记录时,它会引发并发问题。 SQL 会为你生成这个身份,查一下。

【讨论】:

  • 你完全正确。我不敢相信我没有想到这一点。您可能会说我对 SQL 很陌生,所以我也很欣赏这些建议。看起来使用身份肯定是要走的路。
【解决方案2】:

同意 Jamiec 你可能有 int 类型的 [dbo].[Tube Conditions]

单个语句就是一个事务

INSERT INTO [dbo].[Tube Conditions] ([Condition ID],[Condition Name],[Description])
SELECT MAX(isnull([Condition ID],0)) + 1, 'Lathed', 'The tube has been lathed to size'
FROM [dbo].[Tube Conditions]

【讨论】:

  • 是的,一条语句就是一个事务。但是,这仍然不安全,除非相关语句在SERIALIZABLE 隔离级别下执行,而不是在默认的READ COMMITTED 下执行。
  • @JeroenMostert 我想我同意
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多