【发布时间】:2018-11-08 23:54:17
【问题描述】:
我正在尝试创建一个允许将值传递给它的存储过程,但是,当我尝试使用动态 T-SQL 时,我会引发错误 MSG 207
由于以下网站,我知道错误消息应该表明我的语句中的列名拼写错误:
https://www.tsql.info/error/msg-207-level-16-invalid-column-name.php
然而,这没有意义,因为下面的硬编码语句可以正常工作。
INSERT INTO [dbo].[tDriversLicense] (DriversLicensePrefix, DriversLicenseSuffix, DateAdded, DriversLicenseNumber)
VALUES ('shockc', '11653798', GETDATE(), 'GAD4859');
ALTER PROCEDURE [dbo].[spAddDriversLicense]
-- Add the parameters for the stored procedure here
@DriversLicensePrefix NCHAR(8),
@DriversLicenseSuffix NCHAR(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sqlInsertDriversLicense NVARCHAR(MAX)
SET @sqlInsertDriversLicense = 'INSERT INTO [dbo].[tDriversLicense] (DriversLicensePrefix, DriversLicenseSuffix, DateAdded, DriversLicenseNumber)
VALUES (' + @DriversLicensePrefix + ', ' + @DriversLicenseSuffix + ', GETDATE(), GPC4859);'
EXECUTE sp_executesql @sqlInsertDriversLicense
END
我已经将这段代码溢出了好几个小时,我对为什么两个 INSERT 语句之间有任何区别感到非常困惑。传递的值是相同的,但是当我尝试动态传递它们时会引发错误。这如何引发错误??
我使用该视频中的一些代码来尝试学习如何动态传递标量值,并在其他存储过程中获得了运气。
【问题讨论】:
-
动态 SQL 插入中的所有值都没有单引号。 @shockemc
-
向变量添加单引号会将它们作为字符串传递,违背了将它们作为参数传递的目的......不是吗? @马克克拉姆
-
也许,但这会导致您的错误。打印出@/sqlInsertDriversLicense 变量的内容,您将看到问题所在。无论哪种方式,您都应该考虑使用参数而不是内联变量@shockemc
-
msg 207你的消息是不是更像这样:"Msg 207 Invalid column name."?当提到错误消息时,请在问题中包含完整的消息。 (我不会通过数字引用记住每个 dbms 的错误消息,我相信我并不孤单。) -
为什么需要动态 SQL 和
EXEC?这可以直接解决...
标签: sql-server tsql stored-procedures dynamic-sql