读取连接命令时出错

And*_*gel 2 sql-server t-sql

我正在尝试运行一个递归更改表,从我的 sys 表中读取几个参数。

DECLARE @AlterCmd NVARCHAR(MAX)

SELECT top 1
        @AlterCmd = 'ALTER TABLE [dbo].[table] ALTER COLUMN ' + COLUMN_NAME + ' NVARCHAR(' + CHARACTER_MAXIMUM_LENGTH + ')'
    FROM 
        information_schema.columns 
    WHERE 
        table_name = 'table_name' and DATA_TYPE like '%char%'

print @AlterCmd
Run Code Online (Sandbox Code Playgroud)

在此示例代码中,我只想验证命令是否正确,但由于连接中的错误而无法运行它。根据我收到的错误消息:

Msg 245, Level 16, State 1, Line 63
Conversion failed when converting the varchar value ')' to data type int.
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 6

有几件事是错误的:

  1. QUOTENAME()在处理串联值时,您应该始终使用它,从它可以防止 SQL 注入攻击的角度来看,并且因为它可以防止在使用无效字符时出错。

  2. 无论何时连接值,都应该使用NVARCHAR文字和显式转换为所需的数据类型,并且不要依赖隐式转换。

  3. 使用语句终止符。

代码:

DECLARE @AlterCmd NVARCHAR(MAX);

SELECT TOP 1 @AlterCmd = N'ALTER TABLE [dbo].[table] ALTER COLUMN '
                         + QUOTENAME(COLUMN_NAME)
                         + N' NVARCHAR('
                         + CONVERT(NVARCHAR(10), CHARACTER_MAXIMUM_LENGTH)
                         + N');'
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = N'table_name'
       AND DATA_TYPE LIKE N'%char%';

PRINT @AlterCmd;
Run Code Online (Sandbox Code Playgroud)