【问题标题】:how to pass parameter in mssql sever with slashes in between如何在sql server中传递参数,中间有斜线
【发布时间】:2020-10-01 10:58:02
【问题描述】:

我创建了带有 3 个参数的过程,面临的问题是参数之间有斜线和空格。在第三个参数处出现错误,说明 360 处的语法错误。

CREATE PROC getMaxModelVersionNumber( @PassedTableName as NVarchar(255) , @modelName as NVarchar(255), @modelViewName as NVarchar(255) ) 
AS
BEGIN
DECLARE @ActualTableName AS NVarchar(255)

SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)
    SELECT @sql = ' SELECT MAX(modelVersionNumber) FROM ' + @ActualTableName+
      ' WHERE modelName=' + @modelName +  ' AND modelViewName='  + @modelViewName+ ';'

    EXEC(@SQL)
END


EXEC getMaxModelVersionNumber @PassedTableName = 'Läufe', @modelName = 'D1088_x_XX-_M_00_0000_00_x.rvt ', @modelViewName = 'BIM 360 // Design Model // IFC Export // Navisworks'

收到此错误

Msg 102, Level 15, State 1, Line 18
Incorrect syntax near '360'.

【问题讨论】:

  • 请分享更多细节,因为所有作品:dbfiddle.uk/…
  • 仅供参考,对象名称的最大长度为 128 个字符,因为它们的名称使用 sysname 数据类型(nvarchar(128) NOT NULL 的同义词),所以最好使用 sysname用于参数而不是 nvarchar(255)(因为最后 127 个字符实际上毫无意义)。我还建议将模式名称作为参数传递;即使您在省略时默认为N'dbo'
  • 我可以将 3 个参数直接传递给 SQL 查询,而不是使用 QUOTENAME( TABLE_NAME ) 从信息架构中选择表名吗?

标签: sql sql-server database


【解决方案1】:

使用参数传入常量值:

DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = '
SELECT MAX(modelVersionNumber)
FROM ' + @ActualTableName + '
WHERE modelName = @modelName AND modelViewName = @modelViewName';

EXEC sp_executesql @sql,
                   N'@modelName NVarchar(255), @modelViewName NVarchar(255)',
                   @modelName=@modelName, @modelViewName=@modelViewName;

这会将参数值作为参数值传入。不能将表名作为参数传入,但可以传入常量。

注意事项:

  • 您应该使用quotename() 作为表名。这只是传入标识符时的最佳做法。
  • 您还可以通过添加单引号来修改查询字符串。不过我不推荐这种方法。

【讨论】:

  • 我的错,我注意到 OP 在 INFORMAITON_SCHEMA 和引号中抓住了它。 +1
  • SQL 中有一个印刷错误,我在那里修复了,@masterstack。在 + @ActualTableName + 之后缺少一个单引号 (')。添加后,它就是有效的 SQL。
  • 我可以将 3 个参数直接传递给 SQL 查询,而不是使用 QUOTENAME( TABLE_NAME ) 从信息架构中选择表名吗?
  • @masterstack 。 . .不可以。正如答案所指定的,您不能传入表名——或任何其他标识符、SQL 关键字、函数名或运算符。只有常量。
  • @GordonLinoff 谢谢你的回答,所以每次我需要表名时,我都必须从信息架构中选择表名,对吧?
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多