动态SQL SP中的错误

时间:2011-03-23 19:44:13

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

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

   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))'  

我总是得到错误:

Msg 102,Level 15,State 1,Line 77 ','附近的语法不正确。

有人可以帮我吗?

4 个答案:

答案 0 :(得分:3)

你的字符串文字有一个不幸的长度。从varcharnvarchar的隐式字符串转换会截断长度介于4000到8000个字符到4000个字符的字符串。

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

答案 1 :(得分:2)

请勿使用PRINT。有可能PRINT输出本身将被长文本截断。使用

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

检查SSMS中此类变量的值。

答案 2 :(得分:0)

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

PRINT @SQL

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

答案 3 :(得分:0)

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