添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
调皮的凉面  ·  easyui-combobox ...·  5 月前    · 
开朗的风衣  ·  hanwckf编译 - 百度·  5 月前    · 
严肃的跑步鞋  ·  error: '#' is not ...·  5 月前    · 
精明的手术刀  ·  碳氧_百度百科·  7 月前    · 

我做了一个动态表名,但表的参数要用字符串类型的所有参数。

我投了所有的参数,但我得到一个错误。我尝试了所有的方法 例如 +70+ N'70' Cast(70 int) ,等等,但我做不到 你对这个问题有什么想法吗?

CREATE PROCEDURE TEST    
    @FIRMNUMBER VARCHAR(10),  
    @PERIODNUMBER VARCHAR(10),      
    @FCHNO VARCHAR(16),
    @DCDNO VARCHAR(16), 
    @DATE VARCHAR(20),
    @CLINTREF INT, 
    @SLSMNREF INT,
    @BRANCH INT,
    @GENEXP1 VARCHAR(20), 
    @GENEXP2 VARCHAR(20),
    @CREDIT FLOAT
DECLARE @Sql NVARCHAR(MAX);  
    DECLARE @TABLENAME NVARCHAR(40);  
    SET @FIRMNUMBER = REPLACE(STR(@FIRMNUMBER, 3), SPACE(1), '0')
    SET @PERIODNUMBER = REPLACE(STR(@PERIODNUMBER, 2), SPACE(1), '0')
    SET @TABLENAME = 'LG_' + @FIRMNUMBER + '_' + @PERIODNUMBER + '_CLFICHE'
SET @Sql = N'INSERT INTO ' + QUOTENAME(@TABLENAME) + '( FICHENO, DATE_, DOCODE, TRCODE, SPECCODE, CYPHCODE, BRANCH, DEPARTMENT, GENEXP1, GENEXP2, GENEXP3, GENEXP4, GENEXP5, GENEXP6, DEBIT, CREDIT, REPDEBIT,    
REPCREDIT, CAPIBLOCK_CREATEDBY, CAPIBLOCK_CREADEDDATE, CAPIBLOCK_CREATEDHOUR, CAPIBLOCK_CREATEDMIN, CAPIBLOCK_CREATEDSEC, CAPIBLOCK_MODIFIEDBY,    
CAPIBLOCK_MODIFIEDDATE, CAPIBLOCK_MODIFIEDHOUR, CAPIBLOCK_MODIFIEDMIN, CAPIBLOCK_MODIFIEDSEC, ACCOUNTED, INVOREF, CASHACCREF, CASHCENREF, PRINTCNT, CANCELLED,    
CANCELLEDACC, ACCFICHEREF, GENEXCTYP, LINEEXCTYP, TEXTINC, SITEID, RECSTATUS, ORGLOGICREF, WFSTATUS, TIME, CLCARDREF, BANKACCREF, BNACCREF, BNCENTERREF, TRADINGGRP,    
POSCOMMACCREF, POSCOMMCENREF, POINTCOMMACCREF, POINTCOMMCENREF, PROJECTREF, STATUS, WFLOWCRDREF, ORGLOGOID, AFFECTCOLLATRL, GRPFIRMTRANS, AFFECTRISK,    
POSTERMINALNR, POSTERMINALNUM, APPROVE, APPROVEDATE, SALESMANREF, CSTRANSREF, DOCDATE, GUID, DEVIR, PRINTDATE, FOREXIM, TYPECODE, EINVOICE, HOUR_, MINUTE_, DEDUCTCODE    
,ELECTDOC, NOTIFYCRDREF, GIBACCFICHEREF    
VALUES ( '+@FCHNO+' ,'+@DATE+' , '' , 70 , '' , '' ,'+Cast(@BRANCH as int)+' , 0,'+@GENEXP1+','+@GENEXP2+', '' , '', '' ,
'', 0,'+@CREDIT +', 0,'+@CREDIT+', '+1+', '+GETDATE()+', 0, 32, 34, 0, '',0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
0, 1, 0, 0, '+1704971+', '+2012+', 0, 0, 0, '', 0, 0, 0,
0, 0, 0, 0, '', 0, 0 , '+1+', 0, '', 0, '','+@SLSMNREF+', 0,
'','+Cast(NEWID() as nvarchar(50))+', 0 , '', 0, '', 0, 0, 0, ''
, 0,0, 0
EXEC sp_executesql @Sql
exec TEST '7','9','073','BLGNO' ,'2022-2-2',14  ,2  ,0  ,'ACIK1','ACIK2', 120.23```
3 个评论
Stu
应该串联参数,这很容易导致SQL注入--你应该阅读sp_executesql的文档你的查询进行参数化
SMor
如果你使用 "+"运算符,引擎会根据两边的数据类型来决定做什么(添加或连接)。由于任何运算符都要求两边的数据类型相同,如果你不显式地进行转换,那么隐式转换就会根据数据类型的优先级进行。最终结果是加法失败。
SMor
SET @TABLENAME = 'LG_'+@FIRMNUMBER+'_'+@PERIODNUMBER+'_CLFICHE'如果这是你的设计,你将需要更多的tsql技能来在这种环境下有效工作。
sql
sql-server
heker
heker
发布于 2022-02-12
1 个回答
PankajSanwal
PankajSanwal
发布于 2022-02-12
已采纳
0 人赞同

这就是你如何做的。

Int , Float的值只有在铸成varchar后才能连接到动态查询中。这就是你上面的查询中的问题('+Cast(@BRANCH as int)+'.这是不可能的,因为你试图将一个int值连接到varchar字符串。

Varchar, text, String , date或datetime值应该被连接起来,这些值应该用单引号括起来。

为了证明这一点,我在下面的表格中各取了一列int、float和date类型。

Create table temp( name varchar(200), ColumnA int, ColumnB float, ColumnC date)
declare @sql varchar(2000), @name varchar(10)='xyz', @colA int = 1, @colB float = 1.2, @colC datetime = getdate()
set @sql = 'Insert into temp (name,ColumnA, ColumnB, ColumnC) values ('''+@name+''','+cast(@colA as varchar)+','+cast(@colB as varchar)+','''+convert(varchar(10),@colC,120)+''')'
print(@sql)
exec(@sql)