denisenkom / go-mssqldb

Microsoft SQL server driver written in go language
BSD 3-Clause "New" or "Revised" License
1.81k stars 493 forks source link

Multiple query execution plans for query with named parameters #803

Open nicolaepopa opened 4 days ago

nicolaepopa commented 4 days ago

I am using named parameters to build my queries:

`queryString := 'insert into sch.MyTable(Field1,Field2,Field3) values(@Field1,@Field2,@Field3)'

_, err := sn.DbConn.Exec(queryString, sql.Named("Field1", myStruct.Field1), sql.Named("Field2", myStruct.Field2), sql.Named("Field3", myStruct.Field3) )` All fields are strings Running this multiple times with different sizes of strings result in multiple query plans:

`(@Field1 nvarchar(4),@Field2 nvarchar(16),@Field3 nvarchar(16))

INSERT INTO sch.MyTable (Field1,Field2,Field3)

VALUES (@Field1, @Field2,@Field3);`

The size of the nvarchar field declaration varies depending on the size of the input string and SQL creates a plan for each variation. Is there something that I can do that would result in a single query plan for this query?

nicolaepopa commented 4 days ago

I have used Glenn Berry's query 13 to identify this issue https://www.dropbox.com/scl/fi/phyj6sp3cwi6eeglquytq/Azure-SQL-Database-Diagnostic-Information-Queries.sql?rlkey=0rvijqbqr6g91vk0hzax393n7&e=1&dl=0