【问题标题】:Error in Dynamic SQL SP动态 SQL SP 中的错误
【发布时间】:2011-07-21 14:39:42
【问题描述】:

我创建了一个程序,其代码如下:

   Create PROCEDURE Sample( @ID INT )
AS 
    BEGIN
    DECLARE @SQL NVARCHAR(max)
    DECLARE @SchemaName SYSNAME
    DECLARE @TableName SYSNAME
    DECLARE @DatabaseName SYSNAME


     SELECT  @SQL = 'Create Table ' + @DatabaseName + '.'
            + @SchemaName + '.' + @TableName
            + '_temp' + '('
    SELECT  @SQL = @SQL + 'ID int NOT NULL Primary Key, Name VarChar(10))'  

我总是得到错误:

消息 102,级别 15,状态 1,第 77 行 ',' 附近的语法不正确。

谁能帮我解决这个问题?

【问题讨论】:

    标签: sql-server sql-server-2008 dynamic dynamic-sql


    【解决方案1】:

    您的字符串文字长度很不幸。从 varcharnvarchar 的隐式字符串转换会将长度在 4000 到 8000 个字符之间的字符串截断为 4000 个字符。

    在字符串文字前使用N 前缀以避免隐式字符串转换。

    【讨论】:

    • 太长了?我自己从来没有遇到过这个问题。字符串文字在 TSQL 中可以存在多长时间?
    • @Martin - 我不能再复制这个了。将错误代码更改为使用 varchar 来查看差异,并且更改回来以某种方式修复了它。稍后我将对此进行更多研究。确实很奇怪。
    • @Martin - :) 和我发现的差不多。
    • 它不限于字符串文字。如果我尝试DECLARE @sql NVARCHAR(MAX) = ''; declare @t table(c varchar(8000)) insert into @t values (replicate('A',8000)) select LEN(@sql + c) from @t,我会看到相同的结果。在计划中的计算标量中,varchar(8000) 被隐式转换为 nvarchar(4000),也许这被记录在某处......
    • @Mikael - 同意,但这对我来说并不奇怪。我想我希望演员是nvarchar(max),因为连接是nvarchar(max) 变量。显然这不是它的工作方式!
    【解决方案2】:

    不要使用PRINTPRINT 输出本身可能会被长文本截断。使用

    SELECT @SQL as [processing-instruction(x)] FOR XML PATH 
    

    检查 SSMS 中此类变量的值。

    【讨论】:

      【解决方案3】:

      有时在使用动态 sql 时,我发现让它打印变量很有帮助:

      PRINT @SQL
      

      这样您就可以获取输出并在分析器中查看它

      【讨论】:

      • 我尝试在打印时将打印添加到程序中,它只打印到 [Q18_RAW] [varchar](max) NULL,。关于它为什么这样做的任何建议
      • NVARCHAR 的最大值为 4K 字符。也许您的 SQL 中有一堆空格?执行 PRINT LEN(@SQL) 并查看是否为 4K
      • 这不是真的。 nvarchar(max) 允许十亿个字符(2GB 数据和每个字符 2 个字节)
      • @Martin - 对不起,你是对的。您可以在声明语句中传递的最大数值为 4K。我误读了这里的文档:msdn.microsoft.com/en-us/library/ms186939.aspx
      【解决方案4】:

      我将您对 @SQL 的初始声明更改为 DECLARE @SQL VARCHAR(max) 并且它有效(而不是 NVARCHAR)。

      【讨论】:

        猜你喜欢
        • 2013-11-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        相关资源
        最近更新 更多