我正在尝试运行一个递归更改表,从我的 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)
有几件事是错误的:
QUOTENAME()
在处理串联值时,您应该始终使用它,从它可以防止 SQL 注入攻击的角度来看,并且因为它可以防止在使用无效字符时出错。
无论何时连接值,都应该使用NVARCHAR
文字和显式转换为所需的数据类型,并且不要依赖隐式转换。
使用语句终止符。
代码:
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)